2012-08-23 39 views
0

我在4.0版本中创建了一个android应用程序,并将我的sqlite数据库保存在assets文件夹中。当我尝试在2.3版本中运行我的应用程序时,出现错误“错误复制数据库”。我试图将checkdatabase方法更改为以下,但仍然无效。请有人可以指导我解决这个问题。如何解决在android中复制数据库错误的错误?

public boolean checkDataBase() 
    { 
    File dbFile = new File(DB_PATH + DB_NAME); 
    return dbFile.exists(); 
    } 

DBadapter.java

公共类将对DBAdapter延伸SQLiteOpenHelper {

private static String DB_PATH = ""; 
private static final String DB_NAME = "mydatabase.sqlite"; 
private SQLiteDatabase myDataBase1; 
private final Context myContext1; 

private static DBAdapter mDBConnection; 

/** 
* Constructor 
* Takes and keeps a reference of the passed context in order to access to the application assets and resources. 
* @param context 
*/ 
private DBAdapter(Context context) { 
    super(context, DB_NAME, null, 1); 
    this.myContext1 = context; 
    DB_PATH = "/data/data/" 
      + context.getApplicationContext().getPackageName() 
      + "/databases/"; 
    // The Android's default system path of your application database is 
    // "/data/data/mypackagename/databases/" 

} 

/** 
* getting Instance 
* @param context 
* @return DBAdapter 
*/ 
public static synchronized DBAdapter getDBAdapterInstance(Context context) { 
    if (mDBConnection == null) { 
     mDBConnection = new DBAdapter(context); 
    } 
    return mDBConnection; 
} 

/** 
* Creates an empty database on the system and rewrites it with your own database. 
**/ 
public void createDataBase() throws IOException { 
    boolean dbExist = checkDataBase(); 
    if (dbExist) { 
     // do nothing - database already exist 
    } else { 
     // By calling following method 
     // 1) an empty database will be created into the default system path of your application 
     // 2) than we overwrite that database with our database. 
     this.getReadableDatabase(); 
     try { 
      copyDataBase(); 
     } catch (IOException e) { 
      throw new Error("Error copying database"); 
     } 
    } 
} 

/** 
* Check if the database already exist to avoid re-copying the file each time you open the application. 
* @return true if it exists, false if it doesn't 
*/ 

private boolean checkDataBase() { 
    SQLiteDatabase checkDB = null; 
    try { 
     String myPath = DB_PATH + DB_NAME; 
     checkDB = SQLiteDatabase.openDatabase(myPath, null, 
       SQLiteDatabase.OPEN_READONLY); 

    } catch (SQLiteException e) { 
     // database does't exist yet. 
    } 
    if (checkDB != null) { 
     checkDB.close(); 
    } 
    return checkDB != null ? true : false; 
} 




/*public boolean checkDataBase() 
{ 
File dbFile = new File(DB_PATH + DB_NAME); 
return dbFile.exists(); 
}*/ 


/** 
* Copies your database from your local assets-folder to the just created 
* empty database in the system folder, from where it can be accessed and 
* handled. This is done by transfering bytestream. 
* */ 
private void copyDataBase() throws IOException { 
     // Open your local db as the input stream 
    InputStream myInput = myContext1.getAssets().open(DB_NAME); 
     // Path to the just created empty db 
    String outFileName = DB_PATH + DB_NAME; 
     // Open the empty db as the output stream 
    OutputStream myOutput = new FileOutputStream(outFileName); 
     // transfer bytes from the inputfile to the outputfile 
    byte[] buffer = new byte[1024]; 
    int length; 
    while ((length = myInput.read(buffer)) > 0) { 
     myOutput.write(buffer, 0, length); 
    }//// 
     // Close the streams 
    myOutput.flush(); 
    myOutput.close(); 
    myInput.close(); 
} 

/** 
* Open the database 
* @throws SQLException 
*/ 
public void openDataBase() throws SQLException { 
    String myPath = DB_PATH + DB_NAME; 
    myDataBase1 = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READWRITE);  
} 

/** 
* Close the database if exist 
*/ 
@Override 
public synchronized void close() { 
    if (myDataBase1 != null) 
     myDataBase1.close(); 
    super.close(); 
} 

/** 
* Call on creating data base for example for creating tables at run time 
*/ 
@Override 
public void onCreate(SQLiteDatabase db) { 
} 

/** 
* can used for drop tables then call onCreate(db) function to create tables again - upgrade 
*/ 
@Override 
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 


} 



// ----------------------- CRUD Functions ------------------------------ 

/** 
* This function used to select the records from DB. 
* @param tableName 
* @param tableColumns 
* @param whereClase 
* @param whereArgs 
* @param groupBy 
* @param having 
* @param orderBy 
* @return A Cursor object, which is positioned before the first entry. 
*/ 
public Cursor selectRecordsFromDB(String tableName, String[] tableColumns, 
     String whereClase, String whereArgs[], String groupBy, 
     String having, String orderBy) { 
    return myDataBase1.query(tableName, tableColumns, whereClase, whereArgs, 
      groupBy, having, orderBy); 
} 

/** 
* select records from db and return in list 
* @param tableName 
* @param tableColumns 
* @param whereClase 
* @param whereArgs 
* @param groupBy 
* @param having 
* @param orderBy 
* @return ArrayList<ArrayList<String>> 
*/ 
public ArrayList<ArrayList<String>> selectRecordsFromDBList(String tableName, String[] tableColumns, 
     String whereClase, String whereArgs[], String groupBy, 
     String having, String orderBy) {   

    ArrayList<ArrayList<String>> retList = new ArrayList<ArrayList<String>>(); 
     ArrayList<String> list = new ArrayList<String>(); 
     Cursor cursor = myDataBase1.query(tableName, tableColumns, whereClase, whereArgs, 
       groupBy, having, orderBy);   
     if (cursor.moveToFirst()) { 
     do { 
      list = new ArrayList<String>(); 
      for(int i=0; i<cursor.getColumnCount(); i++){     
       list.add(cursor.getString(i)); 
      } 
      retList.add(list); 
     } while (cursor.moveToNext()); 
     } 
     if (cursor != null && !cursor.isClosed()) { 
     cursor.close(); 
     } 
     return retList; 

} 

/** 
* This function used to insert the Record in DB. 
* @param tableName 
* @param nullColumnHack 
* @param initialValues 
* @return the row ID of the newly inserted row, or -1 if an error occurred 
*/ 
public long insertRecordsInDB(String tableName, String nullColumnHack, 
     ContentValues initialValues) { 
    return myDataBase1.insert(tableName, nullColumnHack, initialValues); 
} 

/** 
* This function used to update the Record in DB. 
* @param tableName 
* @param initialValues 
* @param whereClause 
* @param whereArgs 
* @return true/false on updating one or more records 
*/ 
/*public boolean updateRecordInDB(String tableName, 
     ContentValues initialValues, String whereClause, String whereArgs[]) { 
    return myDataBase.update(tableName, initialValues, whereClause, 
      whereArgs) > 0;    
}*/ 

/** 
* This function used to update the Record in DB. 
* @param tableName 
* @param initialValues 
* @param whereClause 
* @param whereArgs 
* @return 0 in case of failure otherwise return no of row(s) are updated 
*/ 
/*public int updateRecordsInDB(String tableName, 
     ContentValues initialValues, String whereClause, String whereArgs[]) { 
    return myDataBase.update(tableName, initialValues, whereClause, whereArgs);  
}*/ 

/** 
* This function used to delete the Record in DB. 
* @param tableName 
* @param whereClause 
* @param whereArgs 
* @return 0 in case of failure otherwise return no of row(s) are deleted. 
*/ 
/*public int deleteRecordInDB(String tableName, String whereClause, 
     String[] whereArgs) { 
    return myDataBase.delete(tableName, whereClause, whereArgs); 
}*/ 

// --------------------- Select Raw Query Functions --------------------- 

/** 
* apply raw Query 
* @param query 
* @param selectionArgs 
* @return Cursor 
*/ 
public Cursor selectRecordsFromDB(String query, String[] selectionArgs) { 
    return myDataBase1.rawQuery(query, selectionArgs);  
} 

/** 
* apply raw query and return result in list 
* @param query 
* @param selectionArgs 
* @return ArrayList<ArrayList<String>> 
*/ 
public ArrayList<ArrayList<String>> selectRecordsFromDBList(String query, String[] selectionArgs) {  
     ArrayList<ArrayList<String>> retList = new ArrayList<ArrayList<String>>(); 
     ArrayList<String> list = new ArrayList<String>(); 
     Cursor cursor = myDataBase1.rawQuery(query, selectionArgs);   
     if (cursor.moveToFirst()) { 
     do { 
      list = new ArrayList<String>(); 
      for(int i=0; i<cursor.getColumnCount(); i++){     
       list.add(cursor.getString(i)); 
      } 
      retList.add(list); 
     } while (cursor.moveToNext()); 
     } 
     if (cursor != null && !cursor.isClosed()) { 
     cursor.close(); 

     } 
     return retList; 
    } 

}

预先感谢

回答

0

CheckDatabase

private boolean checkDataBase() { 
    SQLiteDatabase checkDB = null; 
    try { 
     String myPath = DB_PATH + DB_NAME; 
     checkDB = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READWRITE); 
     } catch (SQLiteException e) { 
     // database does't exist yet. 
     } 
    if (checkDB != null) { 
     checkDB.close(); 
    } 
    return checkDB != null ? true : false; 
} 

变化:

super(context, DB_NAME, null, 1); 

要:

super(context, DB_NAME, null, 2); 

的CreateDatabase

public void createDataBase() throws IOException { 
    boolean dbExist = checkDataBase(); 
    if (dbExist) { 
     // do nothing - database already exist 
      // check if we need to upgrade 
     openDataBase(); 
     int cVersion = myDataBase.getVersion(); 
     if(cVersion != 2){ 
      onUpgrade(myDataBase, myDataBase.getVersion(), 2);} 
     close(); 
    } else { 
     // By calling this method and empty database will be created into 
     // the default system path 
     // of your application so we are gonna be able to overwrite that 
     // database with our database. 

     this.getReadableDatabase(); 
     try { 
      copyDataBase(); 
      } catch (IOException e) { 
      throw new Error("Error copying database"); 
      } 
     } 
} 

然后,您可以创建一个onUpgrade功能如果数据库升级。我希望这有帮助。让我知道我是否遗漏了任何东西。

+0

嗨,感谢您的回应。我试着像你说的。但它仍然显示相同的错误。 – user1448108

+0

您是否将其更改为OPEN_READWRITE而不是OPEN_READ? –

0

尝试使用

checkDB = SQLiteDatabase.openDatabase(myPath, null, 
     SQLiteDatabase.CREATE_IF_NECESSARY); 

insted的的

checkDB = SQLiteDatabase.openDatabase(myPath, null, 
       SQLiteDatabase.OPEN_READONLY); 
相关问题