Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/225.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQLite数据库android创建表_Android_Sqlite - Fatal编程技术网

SQLite数据库android创建表

SQLite数据库android创建表,android,sqlite,Android,Sqlite,我得到了错误“没有这样的表”,并导致我尽一切可能使它消失,现在它消失了,但我感到困惑。这是我的情况 我有两个表需要在应用程序中创建。我在每个表中放置一个类,它看起来像下面的代码。如果我遵循这一点,当我从“Table2”中提取数据时,它会给我带来“没有这样的表”,所以我需要将数据库名称更改为其他值=“DB2”;然后“Table2”将成功创建并能够提取数据 所以我的问题是,这是确保成功创建两个表的正确方法吗?还是我不应该将表分为两类?请建议 public class DB1 extends SQLi

我得到了错误“没有这样的表”,并导致我尽一切可能使它消失,现在它消失了,但我感到困惑。这是我的情况

我有两个表需要在应用程序中创建。我在每个表中放置一个类,它看起来像下面的代码。如果我遵循这一点,当我从“Table2”中提取数据时,它会给我带来“没有这样的表”,所以我需要将数据库名称更改为其他值=“DB2”;然后“Table2”将成功创建并能够提取数据

所以我的问题是,这是确保成功创建两个表的正确方法吗?还是我不应该将表分为两类?请建议

public class DB1 extends SQLiteOpenHelper {
// Database Version
private static final int DATABASE_VERSION = 1;

// Database Name
private static final String DATABASE_NAME = "DB";

// Labels table name
private static final String TABLE_STORE = "Table1";

// Labels Table Columns names
public static final String KEY_1 = "col1"; 

public RC_StoreTbl(Context context) {
    super(context, DATABASE_NAME, null, DATABASE_VERSION);
}

// Creating Tables
@Override
public void onCreate(SQLiteDatabase db) {
    // Category table create query
    String CREATE_TABLE = "CREATE TABLE " + TABLE_STORE + "("
            +KEY_1 + " INTEGER PRIMARY KEY)";
    db.execSQL(CREATE_TABLE);
}
}
另一类

public class DB2 extends SQLiteOpenHelper {
// Database Version
private static final int DATABASE_VERSION = 1;

// Database Name
private static final String DATABASE_NAME = "DB";

// Labels table name
private static final String TABLE_STORE = "Table2";

// Labels Table Columns names
public static final String KEY_1 = "col1"; 

public RC_StoreTbl(Context context) {
    super(context, DATABASE_NAME, null, DATABASE_VERSION);
}

// Creating Tables
@Override
public void onCreate(SQLiteDatabase db) {
    // Category table create query
    String CREATE_TABLE = "CREATE TABLE " + TABLE_STORE + "("
            +KEY_1 + " INTEGER PRIMARY KEY)";
    db.execSQL(CREATE_TABLE);
}
}

不,您应该将表放在一个数据库类中。只要确保无论何时更改代码以修改表或添加/删除表,您都可以清除数据或卸载应用程序并再次运行。您很可能会得到“没有这样的表”“错误,因为您添加或修改了一个表,在这种情况下,在清除数据或卸载应用程序之前,onCreate不会再次被调用。

否您应该有一个类(通常称为
DBopenHelper
)扩展
SQLiteOpenHelper
,在该类中,您必须操作表的创建。”

因此,您的代码如下所示:

    public class DBOpenHelper extends SQLiteOpenHelper {

        public static final String DATABASE_NAME = "DB";


            // Update the DATABASE_VERSION so that onUpgrade can be executed! 
        public static final int DATABASE_VERSION = 2;               

        // Labels table name
        private static final String TABLE_STORE1 = "Table1";

        // Labels Table Columns names
        public static final String TABLE1_KEY_1 = "Tcol1"; 

            // Labels table name
            private static final String TABLE_STORE2 = "Table2";

            // Labels Table Columns names
            public static final String TABLE2_KEY_1 = "Tcol1";              

        public RC_StoreTbl(Context context) {
                super(context, DATABASE_NAME, null, DATABASE_VERSION);
            }

        @Override
        public void onCreate(SQLiteDatabase db) {
            if (!db.isReadOnly()) {
                // Enable foreign key constraints
                db.execSQL("PRAGMA foreign_keys = ON;");
                Log.i("TAG", "FOREIGN KEY constraint enabled!");
            }       

            // table create query
                String CREATE_TABLE = "CREATE TABLE " + TABLE_STORE1 + "("
                        +TABLE1_KEY_1 + " INTEGER PRIMARY KEY)";

            // table create query
                String CREATE_TABLE = "CREATE TABLE " + TABLE_STORE2 + "("
                        +TABLE2_KEY_1 + " INTEGER PRIMARY KEY AUTOINCREMENT)";

// table create query
                String CREATE_TABLE = "CREATE TABLE " + TABLE_STORE + "("
                        +KEY_1 + " INTEGER PRIMARY KEY AUTOINCREMENT)";


    // ITS ALWAYS GOOD TO PUT execSQL in the try catch block for tracking // PROBLEMS/ERRORS/EXCEPTIONS
        try {
                    db.execSQL(CREATE_TABLE);
                } catch (Exception e) {
                    e.printStackTrace();
                }

            } // end onCrate

        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
            Log.i(LOG_TAG, "Upgrading database from " + oldVersion + " to "
                    + newVersion);
            // kill previous tables
            db.execSQL("DROP TABLE IF EXISTS " + TABLE_STORE1);
            db.execSQL("DROP TABLE IF EXISTS " + TABLE_STORE2);
            onCreate(db);
        } // end onUpgrage

    }

您无法创建第二个表,因为数据库存在,只有te first on create可以创建表,请尝试以下操作

 public class DB1 extends SQLiteOpenHelper {
// Database Version
        private static final int DATABASE_VERSION = 1;

// Database Name
        private static final String DATABASE_NAME = "DB";

// Labels table name
        private static final String TABLE_STORE1 = "Table1";
        private static final String TABLE_STORE2 = "Table2";

// Labels Table Columns names
        public static final String KEY_1 = "col1"; 

//first query 
    String firstTable="CREATE TABLE " + TABLE_STORE1 + "("
        +KEY_1 + " INTEGER PRIMARY KEY)";
//second query

    String secondTable="CREATE TABLE " + TABLE_STORE2 + "("
        +KEY_1 + " INTEGER PRIMARY KEY)";

   public RC_StoreTbl(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
   }

// Creating Tables
@Override
public void onCreate(SQLiteDatabase db) {

db.execSQL(firstTable);
db.execSQL(secondTable);
}
}

对于我的英语,XD

< P>你应该考虑改变你的表模型。这将帮助你更好地组织事情,尽早发现错误。你可以找到一个例子

下面是一个表格模型的示例

public class ProductTable implements BaseColumns {
  public static final String NAME = "name";
  public static final String PRICE = "price";
  public static final String TABLE_NAME = "products";

  public static final String CREATE_QUERY = "create table " + TABLE_NAME + " (" +
      _ID + " INTEGER, " +
      NAME + " TEXT, " +
      PRICE + " INTEGER)";

  public static final String DROP_QUERY = "drop table " + TABLE_NAME;
  public static final String SElECT_QUERY = "select * from " + TABLE_NAME;
}
现在在DatabaseHelper中使用以下代码创建表

 @Override
  public void onCreate(SQLiteDatabase sqLiteDatabase) {
    sqLiteDatabase.execSQL(ProductTable.CREATE_QUERY);
    seedProducts(sqLiteDatabase);
  }

很抱歉但是为什么两个表需要两个单独的类呢?这不也是创建两个数据库吗?对不起,我想我误解了这个概念,我认为它会将它视为同一个数据库,并创建不存在的表,我尝试使它更干净,更容易按表/类进行维护。我想你应该阅读本教程。那会帮你把事情弄清楚的。坦斯克的链接。我想我错了!哈哈哈。。。需要更多的学习。我们都在学习。祝你好运。:-)我同意上面的答案。只需添加一点,就可以使用单个数据库处理程序类并在其中创建任意两个或多个表。只需确保卸载(或清除应用程序数据)数据库结构中的每一个更改,因为onCreate只调用一次,即在安装应用程序期间。