Can';t在我的android应用程序中创建SQLite数据库
我正在使用我的应用程序对象(Android building bloc)调用oncreate方法中的数据库构造函数。 但我不明白为什么不能创建它。 我的代码是这样的: my database类,DbHelper作为内部类:Can';t在我的android应用程序中创建SQLite数据库,android,sqlite,android-sqlite,oncreate,Android,Sqlite,Android Sqlite,Oncreate,我正在使用我的应用程序对象(Android building bloc)调用oncreate方法中的数据库构造函数。 但我不明白为什么不能创建它。 我的代码是这样的: my database类,DbHelper作为内部类: package com.example.pharmacie; import android.content.ContentValues; import android.content.Context; import android.database.sqlite.SQLit
package com.example.pharmacie;
import android.content.ContentValues;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;
public class PhData {
private static final String TAG = PhData.class.getSimpleName();
private static final int VERSION = 1;
private static final String DATABASE = "ph_info.db";
private static final String TABLE = "ph_info";
public static final String C_ID = "_id";
public static final String C_CREATED_AT = "created_at";
public static final String C_NAME = "Pharmacie ";
public static final String C_TELE = " ";
public static final String C_ADRESS = "Tet";
public static final String C_HAS_SHIFT = "yes"; // yes if night shift
public static final String C_SCHEDULE = "YYYY-MM-DD";
private static final String GET_ALL_ORDER_BY = C_CREATED_AT + " DESC";
private static final String[] MAX_CREATED_AT_COLUMNS = { "max("
+ PhData.C_CREATED_AT + ")" };
Context context;
private DbHelper dbHelper;
// Inner class: DbHelper implementations
class DbHelper extends SQLiteOpenHelper {
public DbHelper() {
super(context, DATABASE, null, VERSION);
Log.d(TAG, "Constructor called");
}
@Override
public void onCreate(SQLiteDatabase db) {
Log.d(TAG, "Creating database: " + DATABASE);
db.execSQL("create table " + TABLE + " (" + C_ID
+ " int primary key, " + C_CREATED_AT + " int, " + C_NAME
+ " text, " + C_ADRESS + " text, "
+ C_HAS_SHIFT + " text, " + C_SCHEDULE
+ " text, " + C_TELE + " text)");
Log.d(TAG, "database created");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("drop table " + TABLE);
this.onCreate(db);
}
} // end of dbhelper class
public PhData(Context context) {
this.context = context;
this.dbHelper = new DbHelper();
Log.d(TAG, "Initialized data");
}
public void close() {
this.dbHelper.close();
}
public void insertOrIgnore(ContentValues values) {
Log.d(TAG, "insertOrIgnore on " + values);
SQLiteDatabase db = this.dbHelper.getWritableDatabase();
try {
db.insertWithOnConflict(TABLE, null, values,
SQLiteDatabase.CONFLICT_IGNORE);
} finally {
db.close();
}
}
/**
* Deletes ALL the data
*/
public void delete() {
// Open Database
SQLiteDatabase db = dbHelper.getWritableDatabase();
// Delete the data
db.delete(TABLE, null, null);
// Close Database
db.close();
}
}
这是我的应用程序类,我在其中调用构造函数来创建数据库:
package com.example.pharmacie;
import android.app.Application; import android.util.Log;
public class PharmacieApplication extends Application {
private static final String TAG = PharmacieApplication.class.getSimpleName(); PhData phData;
@Override public void onCreate() { super.onCreate();
phData = new PhData(this);
Log.d(TAG, "onCreated"); }
@Override public void onTerminate() { super.onTerminate();
Log.d(TAG, "onTerminated"); }
}
这就是我在日志中看到的:
04-20 03:15:05.968: D/PhData(368): Constructor called
04-20 03:15:05.968: D/PhData(368): Initialized data
04-20 03:15:05.968: D/PharmacieApplication(368): onCreated
04-20 03:15:06.568: D/JoursListActivity(368): onCreated
在您请求访问数据库之前,实际上不会创建该数据库。从: 创建辅助对象以创建、打开和/或管理数据库。这 方法总是很快返回。数据库实际上不是 在getWritableDatabase()或 调用getReadableDatabase()
我正在更改您的代码请输入此代码并重试
public class PhData {
private static final String TAG = PhData.class.getSimpleName();
private static final int VERSION = 1;
private static final String DATABASE = "ph_info.db";
private static final String TABLE = "ph_info";
public static final String C_ID = "_id";
public static final String C_CREATED_AT = "created_at";
public static final String C_NAME = "Pharmacie ";
public static final String C_TELE = " ";
public static final String C_ADRESS = "Tet";
public static final String C_HAS_SHIFT = "yes"; // yes if night shift
public static final String C_SCHEDULE = "YYYY-MM-DD";
private static final String GET_ALL_ORDER_BY = C_CREATED_AT + " DESC";
private static final String[] MAX_CREATED_AT_COLUMNS = { "max("
+ PhData.C_CREATED_AT + ")" };
Context context;
private DbHelper dbHelper;
private SQLiteDatabase db;
// Inner class: DbHelper implementations
class DbHelper extends SQLiteOpenHelper {
public DbHelper() {
super(context, DATABASE, null, VERSION);
Log.d(TAG, "Constructor called");
}
@Override
public void onCreate(SQLiteDatabase db) {
Log.d(TAG, "Creating database: " + DATABASE);
db.execSQL("create table " + TABLE + " (" + C_ID+" INTEGER PRIMARY KEY AUTOINCREMENT, " +
C_CREATED_AT + " TEXT, " +
C_NAME + " text, " +
C_ADRESS + " text, " +
C_HAS_SHIFT + " text, " +
C_SCHEDULE + " text, " +
C_TELE + " text)");
Log.d(TAG, "database created");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("drop table " + TABLE);
onCreate(db);
}
} // end of dbhelper class
public PhData(Context context) {
this.context = context;
this.dbHelper = new DbHelper(context);
db=this.dbHelper.getWritableDatabase();
db=this.dbHelper.getReadableDatabase();
Log.d(TAG, "Initialized data");
}
public void close() {
if (db != null)
db.close();
}
public Database open() throws SQLException{
this.dbHelper= new ContactsDBHelper(con);
db=this.dbHelper.getWritableDatabase();
db=this.dbHelper.getReadableDatabase();
return this;
}
public void insertOrIgnore(ContentValues values) {
Log.d(TAG, "insertOrIgnore on " + values);
SQLiteDatabase db = this.dbHelper.getWritableDatabase();
try {
db.insertWithOnConflict(TABLE, null, values,
SQLiteDatabase.CONFLICT_IGNORE);
} finally {
db.close();
}
}
/**
* Deletes ALL the data
*/
public void delete() {
// Open Database
SQLiteDatabase db = dbHelper.getWritableDatabase();
// Delete the data
db.delete(TABLE, null, null);
// Close Database
db.close();
}
}
可能会对您有所帮助。事实上,我已经找到了导致我遇到另一个问题的根源: 我必须将dbHelper的上下文传递到构造函数中,以便从应用程序类调用它 产生的另一个错误是:
public static final String C_SCHEDULE = "YYYY-MM-DD";
<>你不能用减号作为DB创建中的分隔符,因为虚拟机把它看作是一个数学符号。因此,我的声明必须更改为:
public static final String C_SCHEDULE = "YYYY_MM_DD";
如果数据库在以前的测试中还没有创建,您就签入了系统文件?我的助手对象是PhData类的内部类,或者您的意思是我必须在数据库中插入一些东西才能触发oncreate方法?@SFN没错!具体来说,您必须调用
getReadableDatabase()
或getwriteabledatabase()
。我不相信你真的不需要用它做任何事。