【问题标题】:How to get all tables from SQLite database Android Studio如何从 SQLite 数据库 Android Studio 中获取所有表
【发布时间】:2021-07-02 02:37:25
【问题描述】:

我一直在寻找如何从数据库中获取所有表,我对 Android Studio 的 SQLite 不熟悉。我有一个 DBHelper 类,我用它来制作我的 sql 命令。到目前为止,我收集到的是我必须对 sqlite_master 进行查询,例如“SELECT name FROM sqlite_master WHERE type='table'”。

这是我的 DBHelper 类:

public class DBHelper extends SQLiteOpenHelper
{
public String tableName;
private static final String COLUMN_ID = "id";
private static final String COLUMN_NAME = "name";
private static final String COLUMN_DESC = "desc";
private static final String COLUMN_DECKNAME = "deckname";
private static final String COLUMN_IMAGENAME = "imagename";

public DBHelper(Context context, String tablename) {
    super(context, "UserDecks.db", null, 1);
    tableName = tablename;
}

public DBHelper(Context context){
    super(context, "UserDecks.db", null, 1);
}

@Override
public void onCreate(SQLiteDatabase db) {
    db.execSQL("CREATE TABLE " + tableName + "(" + COLUMN_NAME + " TEXT, " + COLUMN_DESC + " TEXT, " + COLUMN_DECKNAME + " TEXT, " + COLUMN_IMAGENAME + " TEXT)");
}

@Override
public void onUpgrade(SQLiteDatabase db, int i, int i1) {
    db.execSQL("DROP TABLE IF EXISTS " + tableName);
}

@Override
public void onOpen(SQLiteDatabase db) {
    db.execSQL("CREATE TABLE IF NOT EXISTS " + tableName + "(" + COLUMN_NAME + " TEXT, " + COLUMN_DESC + " TEXT, " + COLUMN_DECKNAME + " TEXT, " + COLUMN_IMAGENAME + " TEXT)");
}

public Cursor GetDeckList(){
    SQLiteDatabase sdb = this.getReadableDatabase();
    Cursor cursor = sdb.rawQuery("SELECT name FROM sqlite_master WHERE type='table'", null);
    return cursor;
}

我只粘贴了到达 GetDeckList 方法的地方。

这是我引用 DBHelper 的地方:

    db = new DBHelper(this);
    Cursor cData = db.GetDeckList();
    int numOfRows = cData.getCount();
    if(numOfRows == 0){
        Toast.makeText(this, "Deck list is empty!", Toast.LENGTH_SHORT).show();
    }else{
        while(cData.moveToNext()){
            DL_deckList = new DeckList(cData.getString(0));
            LIST_currentDecks.add(DL_deckList);
        }
        mAdapter = new RecycleViewAdapter(true, LIST_currentDecks, this);
        layoutManager = new LinearLayoutManager(this);
        recyclerView.setLayoutManager(layoutManager);

        recyclerView.setAdapter(mAdapter);
        recyclerView.setHasFixedSize(false);
    }

我想我遗漏了一些代码,因为我正在做我在 stackoverflow 上读到的关于如何从 sqlite_master 查询的内容,但是我的应用程序不断崩溃,因为我一直在尝试创建一个“空”表。当我修改代码时,它一直在调用“onCreate”或“onOpen”,即使我没有尝试制作表格。所以它一直在崩溃,因为我没有给它一个新表。所以我假设我缺少一些代码,但我不知道它是什么。

【问题讨论】:

    标签: android sqlite


    【解决方案1】:

    这样试试

    db = new DBHelper(this);
    Cursor cData = db.GetDeckList();
    if(cData != null) {
        int numOfRows = cData.getCount();
        if(numOfRows == 0){
            Toast.makeText(this, "Deck list is empty!", Toast.LENGTH_SHORT).show();
        }else{
        
            List<String> tableNames = new ArrayList<String>();
            cData.moveToFirst();
            while (!cData.isAfterLast()) {
                tableNames.add(cData.getString(cData.getColumnIndex("name")));
                cData.moveToNext();
            }
            mAdapter = new RecycleViewAdapter(true, tableNames, this);
            
            layoutManager = new LinearLayoutManager(this);
            recyclerView.setLayoutManager(layoutManager);
    
            recyclerView.setAdapter(mAdapter);
            recyclerView.setHasFixedSize(false);
        }
    }
    

    【讨论】:

      【解决方案2】:

      您可以从onCreateonUpgradeonOpen 中删除代码,这将为您提供所需的结果。

      GetDeckList 的结果将只有一条记录:android_metadata,默认为一张表。

      如果您以后需要创建表,请将代码添加回onCreate,在这种情况下,您可以在DBHandler 中为您的新表添加一些常量。

      最后,我建议你有一个单例,只有一个DBHandler 的实例,以避免内存泄漏或内存分配。另一条建议是,如果您可以使用 Android Jetpack 中的抽象库 Room,那就更好了,这个库可以帮助您避免直接使用 SQLite 的重要问题。如果您想查看房间,请查看Room Setup

      【讨论】:

        【解决方案3】:

        尝试使用以下查询获取所有数据库表

         //use below query for reading all table list
           Cursor cursor = sdb.rawQuery("SELECT name FROM sqlite_master WHERE type='table' AND name NOT IN ('android_metadata', 'sqlite_sequence', 'room_master_table') ",null);
        

        【讨论】:

          猜你喜欢
          • 2013-03-01
          • 1970-01-01
          • 2016-08-14
          • 2011-11-17
          • 1970-01-01
          • 1970-01-01
          • 2012-05-21
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多