【问题标题】:Getting list of table names from database in Android application在 Android 应用程序中从数据库中获取表名列表
【发布时间】:2017-10-29 19:16:05
【问题描述】:

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

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

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();

        }
    }

【问题讨论】:

  • 这很奇怪。为什么不知道数据库的表?
  • 嗯,我知道这些表,但想法是应用程序的用户已经将多个列表存储为数据库中的表,并且应该能够看到所有列表(表),以能够选择其中之一。所以这段代码只是为了测试代码。
  • 这就是我的想法——你不应该在运行程序时创建表。数据库模式应该是固定的,并且只添加数据 - 而不是表。
  • SELECT name FROM sqlite_master WHERE (NOT (name = 'android_metadata' OR name LIKE '%sqlite_sequence%')) AND type = 'table'怎么样
  • 致 Mike T:不幸的是,没有工作。 To juergen d:为什么不让用户做一张桌子?

标签: android sqlite tablename


【解决方案1】:

假设当前行是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')

【讨论】:

    猜你喜欢
    • 2013-10-16
    • 1970-01-01
    • 1970-01-01
    • 2011-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多