Tại sao lệnh gọi SQLiteOpenHelper onCreate() mỗi khi ứng dụng của tôi khởi động. Dưới đây là mã của tôi cho onCreate()Cơ sở dữ liệu Android tái tạo mọi ứng dụng được khởi chạy
@Override
public void onCreate(SQLiteDatabase db) {
Log.i("onCreate()", "Enter");
//create cards table
db.execSQL(
"create table circles" +
"("+
"id integer primary key,"+
"x integer not null," +
"y integer not null"+
")"
);
Log.i("onCreate()", "Exit");
}
Tôi có một lớp bên ngoài xung quanh lớp SQLiteOpenHelper mở rộng của tôi, và khi tôi truy vấn, tôi làm điều này:
Cursor cursor = openHelper.getWritableDatabase().rawQuery("select * from circles", null);
và bỏ qua khối này vì điều này câu lệnh if
if (cursor.moveToFirst()) {...}
Dưới đây là toàn bộ lớp Cơ sở dữ liệu wrapper của tôi:
package db.main;import java.util.ArrayList; import android.content.Context; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; import android.util.Log; import testing.main.Circle;
public class DBWrapper {
private static final String DATABASE_NAME = "circles.db"; private static final int DATABASE_VERSION = 1; private static final String[] TABLES = new String[] { "circles"};
private Context context; private OpenHelper openHelper;
public DBWrapper(Context context) { context.deleteDatabase(DATABASE_NAME); this.context = context; this.openHelper = new OpenHelper(this.context); }
public void insertCircle(Circle c) { String sql = "insert into circles (x, y) values (" + c.getX() + ", " + c.getY() + ")"; Log.i("DBWrapper::insertCircle()", "Executing sql: " + sql); openHelper.getWritableDatabase().execSQL(sql); }
public void clearCircles() { String sql = "delete * from circles"; Log.i("DBWrapper::clearCircles()", "Executing sql: " + sql); openHelper.getWritableDatabase().execSQL(sql); }
public ArrayList getCircles() { ArrayList circles = new ArrayList(); Cursor cursor = openHelper.getWritableDatabase().query(TABLES[0], null, null, null, null, null, null); //Cursor cursor = openHelper.getWritableDatabase().rawQuery("select * from circles", null); Log.i("DBWrapper::getCircles()", "move to first1"); if (cursor.moveToFirst()) { Log.i("DBWrapper::getCircles()", "move to first"); do { Log.i("DBWrapper::getCircles()", "Creating circle: " + cursor.getString(1) + ", " + cursor.getString(2)); circles.add(new Circle(Integer.parseInt(cursor.getString(1)), Integer.parseInt(cursor.getString(2)))); } while (cursor.moveToNext()); } if (cursor != null && !cursor.isClosed()) { cursor.close(); } return circles; } private static class OpenHelper extends SQLiteOpenHelper {
OpenHelper(Context context) { super(context, DATABASE_NAME, null, DATABASE_VERSION); } @Override public void onCreate(SQLiteDatabase db) { Log.i("OpenHelper::onCreate()", "Enter"); //create cards table db.execSQL( "create table circles" + "("+ "id integer primary key,"+ "x integer not null," + "y integer not null"+ ")" ); Log.i("OpenHelper::onCreate()", "Exit"); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { Log.w("Example", "Upgrading database, this will drop tables and recreate."); for(String s: TABLES) { db.execSQL("DROP TABLE IF EXISTS " + s); } onCreate(db); }
}}
Hãy cho tôi biết nếu tôi cần phải gửi mã nhiều hơn hoặc bất cứ điều gì. Cảm ơn.
Hmmm. Bạn đang thử nghiệm trên một trình giả lập? Nếu vậy, có lẽ bạn nên kiểm tra để chắc chắn rằng bạn không xóa dữ liệu người dùng từ trình mô phỏng trước khi bắt đầu nó. – Hamy
Không, tôi đang thử nghiệm trên thiết bị – wangburger
Có lẽ bạn có thể đăng toàn bộ mã cơ sở dữ liệu của mình? Tôi không thấy vấn đề trong những gì bạn có ở đây:/ – Hamy