“我收到错误”没有这样的表“并且让我尝试一切可能使它消失,现在它已经消失了,但我很困惑。这是我的情况
我需要在应用中创建2个表。我为每个表放了一个类,它看起来像下面的代码。如果我按照这个,当我从“Table2”中提取数据时,它会打击“No Such Table”,所以我需要将DATABASE_NAME更改为其他值=“DB2”;然后“Table2”将成功创建并能够提取数据。
所以我的问题是这是确保2个表成功创建的正确方法吗?或者我不应该将表分成两类?请指教
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);
}
}
答案 0 :(得分:4)
不,您应该将表放在一个数据库类中。只需确保每当您更改代码以修改表格或添加/删除表格以清除数据或卸载应用程序并再次运行时。您很可能会因为添加或修改表格而出现“ No Such Table ”错误,在这种情况下,在您清除数据或卸载应用之前,不会再次调用 onCreate 。
答案 1 :(得分:1)
不,你应该有一个扩展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
}
答案 2 :(得分:0)
你不能创建第二个表,因为数据库存在,只有第一个创建可以创建表尝试这样的事情
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);
}
}
sory for my english XD
答案 3 :(得分:0)
您应该考虑更改表的模型。这将有助于您更好地组织事情并最早发现错误。您可以找到示例here。
以下是表格模型的示例。
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);
}