我找到了以下线程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();
}
答案 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);
冲突。
表的名称是什么?
REGISTRATION
或USER
?
在方法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 {
我很确定对此也有皮棉检查。