[英]SQLiteDatabase onCreate() and onUpgrade() not being called
[英]onUpgrade and onCreate doesn't running when i called it
我在使用SQLite時遇到問題,即使我更改了DataBase的版本,但我調用DataBaseHelper(存儲onCreate和onUpgrade方法)也無法正常工作,並且沒有錯誤。
為了恢復我的應用程序,我的主要活動叫Singleton,他執行DataBaseHelper。
我的主要活動:
public class irdesApplication extends Activity {
public static final String LOG_TAG="Droidnova";
private Context context = this;
CheckUpdate chUp;
ProgressBar bar;
TextView txtLoading;
Data d = new Data();
Singleton s;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.page_loading);
bar = (ProgressBar) findViewById(R.id.ProgressBarLoad);
txtLoading = (TextView) findViewById(R.id.txtLoading);
new Thread(myThread).start();
bar.setProgress(0);
//Initialisation de la Base
s.getInstance(context);
// ---------- Constitution des logs ------------ //
int logParam =0;
Log.v(LOG_TAG, "logParam value" + logParam);
[...]
}
}
我的單身人士:
package com.irdes.db;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
public class Singleton {
private static Singleton instance;
private DataBaseHelper baseIrdes;
private SQLiteDatabase db;
private Data d = new Data();
private Singleton(Context context){
System.out.println("Construction du Singleton");
d.loadPercent = 10;
d.loadTxt = "Initialisation";
baseIrdes = new DataBaseHelper(context, d.dbName, null, d.dbVersion);
}
public static synchronized Singleton getInstance(Context context){
if (instance == null)
instance = new Singleton(context);
return instance;
}
public void setValue(SQLiteDatabase value){
db = value;
}
public SQLiteDatabase getValue(){
return db;
}
protected void open(){
//on ouvre la BDD en écriture
db = baseIrdes.getWritableDatabase();
}
protected void close(){
//on ferme l'accès à la BDD
db.close();
}
}
我的DataBasHelper活動:
public class DataBaseHelper extends SQLiteOpenHelper {
private Data d = new Data();
public DataBaseHelper(Context context, String name, CursorFactory factory, int version) {
super(context, name, factory, version);
System.out.println("Test");
// TODO Auto-generated constructor stub
}
@Override
public void onCreate(SQLiteDatabase db) {
d.updateDataBase = true;
//Activation prise en charge Foreign Keys
db.execSQL("PRAGMA foreign_keys = ON;");
[...]
db.execSQL("CREATE TABLE "+d.actualiteTable+" ("+d.colActualiteNum+ " INTEGER PRIMARY KEY , "+
d.colActualiteTitre+ " TEXT, "+d.colActualiteDate+" TEXT, "+d.colActualiteLien+" TEXT, "+d.colActualiteTypeActu+" INTEGER, " +
"FOREIGN KEY ("+d.colActualiteTypeActu+") REFERENCES "+d.typeActuTable+" ("+d.colTypeActuNum+"))");
[...]
System.out.println("Create table Complete");
InsertRows(db);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
[...]
db.execSQL("DROP TABLE IF EXISTS "+d.actualiteTable);
[...]
onCreate(db);
}
public void InsertRows (SQLiteDatabase bdd){
System.out.println("Chargement des données");
bdd = this.getWritableDatabase();
ContentValues cv=new ContentValues();
// --------- TypeActu -------- //
cv.put(d.colTypeActuNum, 1);
cv.put(d.coltypeActuLibelle, "Gen");
bdd.insert(d.typeActuTable, d.colTypeActuNum, cv);
[...]
bdd.close();
System.out.println("Données inserées");
}
和數據類以獲得更多理解:
public static final String dbName="irdesDB";
public static final int dbVersion=46;
public static final String actualiteTable="Actualite";
public static final String colActualiteNum="numActu";
public static final String colActualiteTitre="titre";
public static final String colActualiteDate="date";
public static final String colActualiteLien="lien";
public static final String colActualiteTypeActu="numTypeActu";
[...]
如果有幫助,我也會在這里的法語論壇上發布aslo: http : //www.developpez.net/forums/d1110144/java/general-java/java-mobiles/android/sqlite-onupgrade-ne-s-execute -plus /#post6141983
有什么問題 ? 我不明白為什么不執行onCreate和onUpgrade。
僅在調用getWritableDatabase()
或getReadableDatabase()
時才調用這些方法。
在您的情況下,請調用baseIrdes。 open()
方法。
同樣的問題也在這里解決。
根據API。
public SQLiteOpenHelper (Context context, String name, SQLiteDatabase.CursorFactory factory, int version)
由於:API級別1
創建一個輔助對象以創建,打開和/或管理數據庫。 此方法總是很快返回。 在調用getWritableDatabase()或getReadableDatabase()之一之前,實際上不會創建或打開數據庫。
因此,您必須確保運行getReadableDatabase()
或getWritableDatabase()
。 我看到您的open()
方法中有getWritableDatabase()
,但看不到您在何處運行您的open方法? 我個人沒有使用過數據庫助手,所以可能有些我不知道的東西,但是我根本看不到open()
在哪里執行。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.