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