2010-07-29 32 views
8

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.

+2

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

+0

Không, tôi đang thử nghiệm trên thiết bị – wangburger

+0

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

Trả lời

10

Nhìn vào constructor DBWrapper của bạn,

bạn đang gọi điện thoại

context.deleteDatabase(DATABASE_NAME);

này sẽ xóa các tập tin cơ sở dữ liệu mỗi khi bạn gọi nó. Buộc SQLHelper tạo lại cơ sở dữ liệu.

+1

Oh wow ... Cảm ơn bạn đã chỉ ra điều đó. Bây giờ tôi cảm thấy câm – wangburger

+0

@LizB plz giúp tôi [liên kết] (http://stackoverflow.com/questions/41755868/android-sqlite-database-not-working-when-returning-to-main-activity) trong vấn đề của tôi – Tauseef

0

Hãy thử điều này:

public class DataBaseHelper extends SQLiteOpenHelper { 
    private static final String DATENBANK_NAME = "yourdatabase.db"; 
    private static final int DATENBANK_VERSION = 1; 

    public DataBaseHelper(Context context) { 
     super(context, DATENBANK_NAME, null, DATENBANK_VERSION); 
    } 

    public void onCreate(SQLiteDatabase db) { 
     db.execSQL(PartialTripTbl.SQL_CREATE); 
    } 

    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
     db.execSQL("DROP TABLE IF EXISTS " + PartialTripTbl.TABLE_NAME); 
     onCreate(db); 
    } 

} 
+0

Điều này là khá nhiều chính xác những gì tôi có và nó không hoạt động. – wangburger

1

Liên kết bên dưới hy vọng sẽ hữu ích.

stackoverflow.com -> Query if Adroid DB exists!

Hy vọng rằng sẽ giúp

Các tấm áp phích trên cũng đề cập bạn đang xóa cơ sở dữ liệu

content.deleteDabase(DATABASE_NAME) 

trong bạn DBWrapper() constructor

Các vấn đề liên quan