Проверка, пуста ли база данных SQLITE, зависает - PullRequest
0 голосов
/ 15 ноября 2018

Я нашел следующую ветку Проверьте, пуста ли база данных .Но данное решение, похоже, не работает для меня.Может кто-нибудь дать мне подсказку, как действовать?Я новичок в SQlite и Android студии.Спасибо

Это то, что я пытаюсь сделать.

public class MainActivity extends AppCompatActivity {
    public static boolean firstOrNot = false;
    static User user;
    MyDBHandler myDb;
    @Override

    protected void onCreate(Bundle savedInstanceState) {
        myDb = new MyDBHandler(this);

Я инициализирую свою переменную базы данных.

myProgressBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

            if(myDb.isNotEmpty() != true) 

Ниже здесь, где возникает проблема.Когда я вызываю этот метод, кажется, что моя программа полностью зависает.Я хочу, чтобы он возвращал логическое значение, чтобы увидеть, пуста ли база данных или нет.Так выглядит метод

public boolean isNotEmpty(){
    SQLiteDatabase db = this.getWritableDatabase();

    Cursor mCursor = db.rawQuery("SELECT * FROM " + TABLE_NAME, null);
    Boolean rowExists;

    if (mCursor.moveToFirst())
    {
        // DO SOMETHING WITH CURSOR
        rowExists = true;

    } else
    {
        // I AM EMPTY
        rowExists = false;
    }

    return rowExists;
}

Так выглядит остальная часть класса MyDBHandler.

package com.example.marko.lektion2;

import android.database.DatabaseErrorHandler;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.content.Context;
import android.content.ContentValues;
import android.database.Cursor;
import android.util.Log;


public class MyDBHandler extends  SQLiteOpenHelper{

    private static final String TAG = "DatabaseHelper";


    public static final String TABLE_NAME  ="REGISTRATION";
    public static final String COLUMN_ID = "ID";
    public static final String COLUMN_WEIGHT = "WEIGHT";
    public static final String COLUMN_AGE = "AGE";
    private static final String[] COLUMNS = { COLUMN_ID, COLUMN_WEIGHT, COLUMN_AGE};


    public MyDBHandler(Context context ) {
        super(context, TABLE_NAME, null , 1);
      //  SQLiteDatabase db = this.getWritableDatabase();
    }



    @Override
    public void onCreate(SQLiteDatabase db) {
        String createTable = "CREATE TABLE USER (" +  "id INTEGER PRIMARY KEY AUTOINCREMENT ," +
                "weight INTEGER ," + " age INTEGER)  ";
            db.execSQL(createTable);

    }

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


    public User getUser(int id) {
        SQLiteDatabase db = this.getReadableDatabase();
        Cursor cursor = db.query(TABLE_NAME, // a. table
                COLUMNS, // b. column names
                " id = ?", // c. selections
                new String[] { String.valueOf(id) }, // d. selections args
                null, // e. group by
                null, // f. having
                null, // g. order by
                null); // h. limit

        if (cursor != null)
            cursor.moveToFirst();

        User user = new User();
        user.setId(Integer.parseInt(cursor.getString(0)));
        user.setWeight (Integer.parseInt(cursor.getString(1)));
        user.setAge(Integer.parseInt(cursor.getString(2)));

        return user;
    }


    public void addUser(User player) {
        SQLiteDatabase db = this.getWritableDatabase();
        ContentValues values = new ContentValues();
        values.put(COLUMN_WEIGHT, player.getWeight());
        values.put(COLUMN_AGE, player.getAge());
        // insert
        db.insert(TABLE_NAME,null, values);
        db.close();
    }

Ответы [ 2 ]

0 голосов
/ 15 ноября 2018

В вашем MyDBHandler классе эта строка:

public static final String TABLE_NAME  ="REGISTRATION";

и это:

String createTable = "CREATE TABLE USER (" +  "id INTEGER PRIMARY KEY AUTOINCREMENT ," + "weight INTEGER ," + " age INTEGER)  ";
db.execSQL(createTable);

конфликт.

Как называется ваш стол?

REGISTRATION или USER?
В вашем методе isNotEmpty() вы используете TABLE_NAME, то есть REGISTRATION, но вы создали таблицу с именем USER.

Определитесь с именем таблицы, внесите изменения в свой код,
удалите приложение с устройства / эмулятора, чтобы удалить базу данных, и снова запустите ее, чтобы заново создать базу данных.
Заполните таблицу и попробуйте еще раз свой код.

0 голосов
/ 15 ноября 2018

Здесь довольно много проблем

1.) Не выполнять запрос к базе данных в потоке пользовательского интерфейса

2.) Вы можете легко сократить время, необходимое для этого вызова, с помощью

Cursor mCursor = db.rawQuery("SELECT * FROM " + TABLE_NAME + " LIMIT 1", null);

3.) Не называйте это mCursor, если это не поле члена, просто назовите его cursor

4.) Вы не закрываете этот курсор, вы должны закрыть его в блоке finally { в конце.

Cursor cursor = null;
try {
    cursor = db.rawQuery("SELECT * FROM " + TABLE_NAME + " LIMIT 1", null);
    ...
} finally {
    if(cursor != null) {
        cursor.close();
    }
}

Я почти уверен, что для этого тоже есть проверка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...