Я искал, как получить все таблицы из базы данных, я не знаком с SQLite для Android Studio. У меня есть класс DBHelper, который я использую для выполнения команд sql. На данный момент я понял, что мне нужно сделать запрос к sqlite_master, например « ВЫБРАТЬ имя 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 , даже если я не пытаюсь создать таблицу. Так что он продолжает вылетать, потому что я не даю ему новую таблицу. Итак, я предполагаю, что мне не хватает кода, но я не знаю, что это такое.

2
lotusdesignz 2 Июл 2021 в 05:37

3 ответа

Лучший ответ

Попробуй вот так

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
Sabrina N 2 Июл 2021 в 03:24

Вы можете удалить код из onCreate, onUpgrade, onOpen, и это даст вам результаты, которые вы ищете.

Результатом GetDeckList будет только одна запись: android_metadata, таблица по умолчанию.

Если вам нужно будет создавать таблицы в будущем, затем добавьте код обратно в onCreate, в этом случае вы могли бы иметь некоторые константы в вашем DBHandler для ваших новых таблиц.

Наконец, я рекомендую вам иметь синглтон, чтобы иметь только один экземпляр DBHandler, чтобы избежать утечек памяти или выделения памяти. Еще один совет: если вы можете использовать библиотеку абстракции Room из Android Jetpack, гораздо лучше, эта библиотека избавит вас от важных проблем, связанных с использованием SQLite напрямую. Если вы хотите проверить комнату, пожалуйста, проверьте Настройка комнаты

1
Wilson Castiblanco 2 Июл 2021 в 03:13

Попробуйте выполнить следующий запрос для получения всех таблиц базы данных

 //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);
1
Dharmender Manral 2 Июл 2021 в 08:28