我想检查数据库是否存在。如果不存在,我会将文件复制到特定路径。这里的代码如下:
主.java
UserDbAdapter objChatMessageDbAdapter = new UserDbAdapter();
objChatMessageDbAdapter.context = context;
User objChatMessage = objChatMessageDbAdapter.getUser();
if(objChatMessage.getID()<1){
//call register intent
}else{
// call the first intent
}
用户数据库适配器.java
private SQLiteDatabase db;
private static String TABLE_USER = "User";
private boolean isDbClosed =true;
public Context context;
String TAG = "UserDbAdapter";
public UserDbAdapter() { }
public void init(Context context) {
if(isDbClosed){
DatabaseAdapter dbAdapter = DatabaseAdapter.getInstance(context);
isDbClosed =false;
db = dbAdapter.getWritableDatabase();
}
this.context = context;
}
private void processConnection()
{
Log.i(TAG, "isDbClosed==="+isDbClosed);
if(isDbClosed){
DatabaseAdapter dbAdapter = new DatabaseAdapter(context);
dbAdapter = DatabaseAdapter.getInstance(context);
isDbClosed =false;
db = dbAdapter.getWritableDatabase();
Log.i(TAG, "processConnection db===="+db.toString());
}
}
public boolean isDatabaseClosed(){
return isDbClosed;
}
public User getUser()
{
processConnection();
User objChatMessageEntity = new User();
String selectQuery = "Select UserId, Name, Password FROM "+TABLE_USER;
Cursor cursor = db.rawQuery(selectQuery, null);
// looping through all rows and adding to list
if (cursor.moveToFirst()) {
objChatMessageEntity = fieldMappingForGetRecord(cursor);
}
cursor.close();
db.close();
isDbClosed =true;
return objChatMessageEntity;
}
}
数据库适配器.java
private static String dbPath;
private static String dbName = "ownexpensesdb";
private SQLiteDatabase applicationDatabase;
public final Context applicationContext;
private static DatabaseAdapter mInstance = null;
private static final int DATABASE_VERSION = 1;
public static DatabaseAdapter getInstance(Context ctx) {
if (mInstance == null) {
dbPath = "/data/data/" + ctx.getPackageName() + "/databases/";
mInstance = new DatabaseAdapter(ctx.getApplicationContext());
}
return mInstance;
}
public DatabaseAdapter(Context context) {
super(context, dbName , null, DATABASE_VERSION);
this.applicationContext = context;
boolean dbExist = checkDataBase();
//SQLiteDatabase db_Read = null;
if (dbExist){
Log.w("Database","file found ");
openDataBase();
}
else
{
Log.w("Database","file not found ");
this.getReadableDatabase();
try
{
copyDatabase();
}
catch (IOException e)
{
Log.e("Error",""+e.getMessage());
e.printStackTrace();
}
}
}
private boolean checkDataBase(){
File dbFile = new File( dbPath + dbName);
return dbFile.exists();
}
private void copyDatabase() throws IOException
{
InputStream input = applicationContext.getAssets().open(dbName);
String outPutFileName= dbPath + dbName ;
OutputStream output = new FileOutputStream( outPutFileName);
byte[] buffer = new byte[1024];
int length;
while ((length = input.read(buffer))>0){
output.write(buffer, 0, length);
}
output.flush();
output.close();
input.close();
}
public void openDataBase() throws SQLException
{
String fullDbPath= dbPath + dbName;
Log.w("Database","open DB");
try
{
applicationDatabase = SQLiteDatabase.openDatabase( fullDbPath, null,SQLiteDatabase.OPEN_READONLY);
}
catch (Exception e) {
Log.e("error",e.toString());
}
}
@Override
public synchronized void close() {
if( applicationDatabase != null)
applicationDatabase .close();
super.close();
}
@Override
public void onCreate(SQLiteDatabase db) {
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
01:10.880:W/System.err(9975):引起:libcore.io.ErrnoException:打开失败:EROFS(只读文件系统)08-28 11:01:10.885:W/System.err(9975) : 在 libcore.io.Posix.open(Native Method) 08-28 11:01:10.885: W/System.err(9975): 在 libcore.io.BlockGuardOs.open(BlockGuardOs.java:110) 08-28 11 :01:10.885: W/System.err(9975): 在 libcore.io.IoBridge.open(IoBridge.java:400) 08-28 11:01:10.885: W/System.err(9975): ... 19 更多 08-28 11:01:10.885: W/Database(9975): 找到文件 08-28 11:01:10.885: W/Database(9975): 打开 DB 08-28 11:01:10.895: I/UserDbAdapter (9975):processConnection db====SQLiteDatabase:/data/data/com.canmmy.expensesmanager/databases/ownexpensesdb 08-28 11:01:10.895:I/sqlite-select 查询(9975):选择用户 ID,名称,来自用户的密码;08-28 11:01:10.895: E/SQLiteLog(9975): (1) 没有这样的表: 用户 08-28 11:01:10.895: D / AndroidRuntime(9975):关闭VM 08-28 11:01:10.895:W / dalvikvm(9975):threadid = 1:线程退出但未捕获异常(组= 0x410502a0)08-28 11:01:10.900:E /AndroidRuntime(9975): FATAL EXCEPTION: main 08-28 11:01:10.900: E/AndroidRuntime(9975): android.database.sqlite.SQLiteException: no such table: User (code 1): , while compile: Select UserId ,姓名,密码来自用户;08-28 11:01:10.900: E/AndroidRuntime(9975): 在 android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method) 08-28 11:01:10.900: E/AndroidRuntime(9975): 在 android.database .sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:1011) 08-28 11:01:10.900: E/AndroidRuntime(9975): 在 android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:622) 08-28 11 :01:10.900:E / AndroidRuntime(9975):在android。