检查Android中的应用程序数据库中是否存在列

Lun*_*box 25 database sqlite android

在Android中是否有一种很好的方法来查看应用程序数据库中的表中是否存在列?(我知道有一些类似于这个的问题,但似乎没有任何Android特定的.)

mar*_*ant 45

cursor.getColumnIndex(String columnName)如果列不存在则返回-1.所以我基本上会执行一个简单的查询,如"SELECT*FROM xxx LIMIT 0,1",并使用光标确定您所寻找的列是否存在

要么

您可以尝试查询"SELECT theCol FROM xxx"列并捕获异常

  • 试试SQLiteDatabase.rawQuery("SELECT*FROM table LIMIT 0,1",null); 而不是使用构建器 (2认同)

fle*_*exo 34

我的功能基于@martinpelants回答:

private boolean existsColumnInTable(SQLiteDatabase inDatabase, String inTable, String columnToCheck) {
    Cursor mCursor = null;
    try {
        // Query 1 row 
        mCursor = inDatabase.rawQuery("SELECT * FROM " + inTable + " LIMIT 0", null);

        // getColumnIndex() gives us the index (0 to ...) of the column - otherwise we get a -1
        if (mCursor.getColumnIndex(columnToCheck) != -1)
            return true;
        else
            return false;

    } catch (Exception Exp) {
        // Something went wrong. Missing the database? The table?
        Log.d("... - existsColumnInTable", "When checking whether a column exists in the table, an error occurred: " + Exp.getMessage());
        return false;
    } finally {
        if (mCursor != null) mCursor.close();
    }
}
Run Code Online (Sandbox Code Playgroud)

只需致电:

boolean bla = existsColumnInTable(myDB,"MyTable","myColumn2check");
Run Code Online (Sandbox Code Playgroud)

  • 你应该在`finally`块中关闭光标! (6认同)

mia*_*lle 5

我实际上写了这个看起来很干净的函数:

private boolean field_exists( String p_query )
{
    Cursor mCursor  = mDb.rawQuery( p_query, null );

    if  (  ( mCursor != null ) && ( mCursor.moveToFirst()) )
    {
        mCursor.close();
        return true ;
    }

    mCursor.close();
    return false ;
}
Run Code Online (Sandbox Code Playgroud)

我这样称呼它:

if  ( field_exists( "select * from sqlite_master "              
    + "where name = 'mytable' and sql like '%myfield%' " ))
{
    do_something ;
}
Run Code Online (Sandbox Code Playgroud)