2010-07-29 14 views
8

Warum ruft SQLiteOpenHelper onCreate() bei jedem Start meiner Anwendung auf. Hier ist mein Code für onCreate()Android-Datenbank wird jedes Mal neu erstellt, wenn die Anwendung gestartet wird

@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"); 
    } 

Ich habe eine außerhalb des Unterrichts um meine erweiterten SQLiteOpenHelper Klasse, und wenn ich fragen, ich dies tun:

Cursor cursor = openHelper.getWritableDatabase().rawQuery("select * from circles", null); 

und überspringt diesen Block wegen dieser if-Anweisung

if (cursor.moveToFirst()) {...} 

Hier ist meine gesamte Datenbank-Wrapper-Klasse:

 
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); }

} }

Lassen Sie mich wissen, wenn ich mehr Code oder etwas brauchen, um zu Posten. Vielen Dank.

+2

Hmmm die Datenbank erwähnt Sie löschen. Testen Sie auf einem Emulator? Wenn dies der Fall ist, sollten Sie sicherstellen, dass Sie die Benutzerdaten nicht vor dem Starten aus dem Emulator löschen. – Hamy

+0

Nein Ich teste auf einem Gerät – wangburger

+0

Vielleicht könnten Sie Ihren gesamten Datenbankcode posten? Ich sehe das Problem nicht in dem, was Sie hier haben:/ – Hamy

Antwort

10

Sehen Sie sich Ihre DBWrapper Konstruktor

Sie anrufen

context.deleteDatabase(DATABASE_NAME);

Dadurch wird die Datenbankdatei jedes Mal, wenn Sie es nennen löschen. Erzwingen des SQLHelper zum Wiederherstellen der Datenbank.

+1

Oh wow ... Danke für das Hinzeigen. Jetzt fühle ich mich dumm – wangburger

+0

@LizB plz helfen mir [link] (http://stackoverflow.com/questions/41755868/android-sqlite-database-not-working-with-returning-to-main-activity) in meinem Problem – Tauseef

0

Versuchen Sie folgendes:

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

Das ist ziemlich genau das, was ich habe und es funktioniert nicht. – wangburger

Verwandte Themen