从 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')
我正在尝试从 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')