如何检查Android SQLite数据库中是否存在表格?

我有一个android应用程序需要检查数据库中是否有记录,如果没有,处理一些事情并最终插入它,并且只要数据存在就从数据库读取数据。 我使用SQLiteOpenHelper的子类来创建并获取SQLiteDatabase的可重写实例,如果它不存在,我认为它会自动处理创建表(因为执行该操作的代码位于onCreate(...)中。 ) 方法)。

但是,当表尚不存在,并且第一个方法运行SQLiteDatabase对象我有一个调用查询(...),我的logcat显示“我/数据库(26434)的错误:sqlite返回:错误代码= 1,msg =没有这样的表:appdata“,果然,appdata表没有被创建。

任何想法为什么?

我正在寻找一种方法来测试表是否存在(因为如果它不存在,数据当然不在其中,我不需要读取它,直到我写入它,这似乎创建表正确地),或者确保它被创建并且只是空的,以便第一次调用查询(...)

编辑
这是后面的两个答案发布:
我想我可能已经找到了问题。 出于某种原因,我决定为每个表创建一个不同的SQLiteOpenHelper,尽管它们都访问同一个数据库文件。 我认为重构该代码只使用一个OpenHelper,并在其onCreate中创建两个表可能会更好...


试试这个:

public boolean isTableExists(String tableName, boolean openDb) {
    if(openDb) {
        if(mDatabase == null || !mDatabase.isOpen()) {
            mDatabase = getReadableDatabase();
        }

        if(!mDatabase.isReadOnly()) {
            mDatabase.close();
            mDatabase = getReadableDatabase();
        }
    }

    Cursor cursor = mDatabase.rawQuery("select DISTINCT tbl_name from sqlite_master where tbl_name = '"+tableName+"'", null);
    if(cursor!=null) {
        if(cursor.getCount()>0) {
                            cursor.close();
            return true;
        }
                    cursor.close();
    }
    return false;
}

我对Android SQLite API一无所知,但如果您能够直接在SQL中与它交谈,则可以这样做:

create table if not exists mytable (col1 type, col2 type);

这将确保表格始终创建,如果已经存在,不会抛出任何错误。


虽然这个问题已经有很多很好的答案,但我想出了另一个我认为更简单的解决方案。 用try块和下面的catch语句围绕你的查询:

catch (SQLiteException e){
    if (e.getMessage().contains("no such table")){
            Log.e(TAG, "Creating table " + TABLE_NAME + "because it doesn't exist!" );
            // create table
            // re-run query, etc.
    }
}

它为我工作!

链接地址: http://www.djcxy.com/p/19797.html

上一篇: How does one check if a table exists in an Android SQLite database?

下一篇: Simulating UPSERT in presence of UNIQUE constraints