安卓SQLite数据库创建表格

3
我出现了“无此表”错误,尝试了各种方法来解决它,现在它已经解决了,但我还是感到困惑。这是我的情况:
我有两个需要在应用程序中创建的表格。我为每个表格放置了一个类,代码如下所示。如果我按照这样做,当我从“Table2”中提取数据时,会出现“无此表”的错误,因此我需要将DATABASE_NAME更改为另一个值=“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);
}
}

抱歉。但是为什么您需要为两个表格创建两个单独的类呢?这不也会创建两个数据库吗? - Siddharth Lele
抱歉,我觉得我对这个概念有所误解,我以为它会将其视为同一数据库并创建不存在的表格,但实际上不是这样。我试图通过表格/类使其更加清晰易于维护。 - tsohtan
1
我认为你应该阅读一下这个教程。那会让你的事情更清楚。http://www.vogella.com/articles/AndroidSQLite/article.html - Siddharth Lele
谢谢提供链接。我觉得我错了!哈哈哈……需要更多学习。 - tsohtan
我们都在不断学习。祝你好运。 :-) - Siddharth Lele
4个回答

5
不,你应该将表放在一个数据库类中。只需确保每当更改代码以修改表或添加/删除表时,您清除数据或卸载应用并重新运行即可。您很可能会因为添加或修改表而获得“无此表”错误,在这种情况下,只有在清除数据或卸载应用后才会再次调用 onCreate

我同意上面的答案。只是想补充一点,你可以使用一个单一的数据库处理类,并在其中创建任意两个或更多的表格。只要确保在每次更改数据库结构时卸载(或清除应用程序数据),因为onCreate仅在应用程序安装期间调用一次。 - SKK

2

不,你应该有一个类(通常我们命名为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

    }

0

你应该考虑改变表格的模型。这将帮助你更好地组织事物并尽早捕捉错误。你可以在这里找到一个例子。

下面是一个表格模型的例子。

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);
  }

0

你无法创建第二个表,因为数据库已经存在,只有第一个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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接