从 Android 应用程序的数据库中获取 table 名称列表

Getting list of table names from database in Android application

我正在尝试从 SQLite 数据库中获取 table 名称的列表。我设法得到了这个,但我也得到了临时的 table 名字,比如 'android_metadata' 和 'sqlite_sequence'。我想排除这两个。

但是,我无法让它正常工作。

SQLiteDatabase database = 
getBaseContext().openOrCreateDatabase("vocabularyDatabase", 
MODE_PRIVATE, null);

    Cursor c = database.rawQuery(  "SELECT name FROM sqlite_master 
      WHERE (type = 'table') AND (name NOT LIKE 'sqlite_sequence' OR 
      name NOT LIKE 'android_metadata') ", 
      null);

    if (c.moveToFirst()){
        while (!c.isAfterLast() ){
                listOfWords.add(c.getString(c.getColumnIndex("name")) 
                 );
                c.moveToNext();

        }
    }

假设当前行是 android_metadata。表达式 name NOT LIKE 'android_metadata' 将为假,但表达式 name NOT LIKE 'sqlite_sequence' 将为真。所以 WHERE 子句简化为 true AND (true OR false),这是真的。

您需要将 OR 替换为 AND:

WHERE type = 'table'
  AND (name NOT LIKE 'sqlite_sequence' AND
       name NOT LIKE 'android_metadata')

如果你真的想使用OR,你必须应用DeMorgan's laws并否定整个条件:

WHERE type = 'table'
  AND NOT (name LIKE 'sqlite_sequence' OR
           name LIKE 'android_metadata')

或者,只需将 IN 与列表一起使用:

WHERE type = 'table'
  AND name NOT IN ('sqlite_sequence', 'android_metadata')