我有一个android应用程序,它需要检查数据库中是否已经有记录,如果没有,则处理一些事情并最终插入它,如果数据确实存在,则简单地从数据库中读取数据。我使用SQLiteOpenHelper的一个子类来创建和获取SQLiteDatabase的一个可重写实例,我认为如果表不存在,它会自动创建该表(因为执行此操作的代码在onCreate(...)中)方法)。
但是,当表还不存在时,并且在我拥有的SQLiteDatabase对象上运行的第一个方法是调用query(...),我的logcat显示一个错误"I/Database(26434):sqlite returned: error code = 1,msg = no the table: appdata",果然,appdata表没有被创建。
你知道为什么吗?
我正在寻找一种方法来测试表是否存在(因为如果它不存在,数据肯定不在其中,并且我不需要读取它,直到我写入它,这似乎可以正确地创建表),或者寻找一种方法来确保它被创建,并且只是空的,以便第一次调用query(...)
编辑
这是在以下两个答案之后发布的:
我想我可能找到问题所在了。出于某种原因,我决定为每个表创建一个不同的SQLiteOpenHelper,即使两者访问相同的数据库文件。我认为将代码重构为只使用一个OpenHelper,并在它的onCreate中创建两个表可能会更好……
发布于 2010-06-18 02:11:09
是的,事实证明我编辑的理论是正确的:导致onCreate方法不能运行的问题是SQLiteOpenHelper
对象应该引用数据库,而不是每个表都有一个单独的数据库。将两个表打包到一个SQLiteOpenHelper
中就解决了这个问题。
发布于 2011-10-23 07:52:03
试试这个:
public boolean isTableExists(String tableName, boolean openDb) {
if(openDb) {
if(mDatabase == null || !mDatabase.isOpen()) {
mDatabase = getReadableDatabase();
}
if(!mDatabase.isReadOnly()) {
mDatabase.close();
mDatabase = getReadableDatabase();
}
}
String query = "select DISTINCT tbl_name from sqlite_master where tbl_name = '"+tableName+"'";
try (Cursor cursor = mDatabase.rawQuery(query, null)) {
if(cursor!=null) {
if(cursor.getCount()>0) {
return true;
}
}
return false;
}
}
发布于 2010-06-17 12:47:53
我对安卓SQL一无所知,但如果你能够直接用SQLite与它对话,你可以这样做:
create table if not exists mytable (col1 type, col2 type);
这将确保始终创建表,并且如果表已经存在,则不会抛出任何错误。
https://stackoverflow.com/questions/3058909
复制相似问题