0

我正在尝试从 SQLite 数据库中获取表名列表。我设法得到了这个,但我也得到了像'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();

        }
    }
4

1 回答 1

2

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

您需要将其替换ORAND

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

如果你真的想使用OR,你必须应用德摩根定律并否定整个条件:

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')
于 2017-10-29T22:18:46.630 回答