检查SQLITE数据库是否为空将冻结应用程序

时间:2018-11-14 22:06:43

标签: java android sqlite

我找到了以下线程Check whether database is empty。但是给出的解决方案似乎对我不起作用。有人可以给我提示如何进行吗?我是SQlite和Android Studio的新手。谢谢

这就是我想要做的。

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 :(得分:2)

在您的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);

冲突。

表的名称是什么?

REGISTRATIONUSER
在方法isNotEmpty()中,您使用了TABLE_NAME的{​​{1}},但是您创建了一个名为REGISTRATION的表。

下定决心表的名称,在代码中进行更改,
从设备/模拟器中卸载应用程序,以便删除数据库并重新运行以重新创建数据库。
重新填充表格,然后重试您的代码。

答案 1 :(得分:0)

这里有很多问题

1。)不要在UI线程上进行数据库查询

2。),您可以轻松减少此呼叫花费的时间

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

3。)如果它不是成员字段,请勿将其命名为mCursor

4。)您没有关闭该光标,应该在结尾的cursor块中关闭它。

finally {

我很确定对此也有皮棉检查。