我最近3個小時試圖完成此任務。我正在製作一個應用程序,該應用程序將隨裝載填充表的數據庫一起發佈,而這些表在客戶端設備上不會更改 我設法做到這一點,把它放在資產文件夾中,並將其作爲一個字節流複製到手機上的相應數據文件夾。問題是當我想更新數據庫時,我無法使它工作。我從電話(從代碼)中刪除數據文件夾中的數據庫,但複製新數據庫總是失敗,或者複製的數據庫具有適當的大小,但沒有表格。 如何做到這一點?還是有更簡單的方法?我可以直接從資產中打開數據庫嗎(如果可以的話,它會是最簡單的方式,但我無法找到如何從代碼訪問資產的路徑)?在Android中更新預填充的數據庫
1
A
回答
4
這裏是我使用的代碼:
public class DataBaseHelper extends SQLiteOpenHelper {
private static final String DB_PATH = "/data/data/com.project.mydb/databases/";
private static final String DB_NAME = "mydb.db";
private static final String DB_TABLE = "words";
private static final int DB_VERSION = 6;
private static final String TAG = "DataBaseHelper";
int id = 0;
Random random = new Random();
private SQLiteDatabase myDataBase;
private final Context myContext;
public DataBaseHelper(Context context){
super(context, DB_NAME, null, DB_VERSION);
this.myContext = context;
}
@Override
public void onCreate(SQLiteDatabase db){
createDB();
}
@Override
public void onUpgrade (SQLiteDatabase db, int oldVersion, int newVersion){
Log.w(TAG, "Upgrading DB from version " + oldVersion + " to " +
newVersion + ", which will destroy all old data");
db.execSQL("DROP TABLE IF EXISTS " + DB_TABLE);
onCreate(db);
}
public void createDataBase(){
createDB();
}
private void createDB(){
boolean dbExist = dbExists();
if(!dbExist){
copyDataBase();
}
else if(dbExist){
copyDataBase();
}
}
private boolean dbExists(){
SQLiteDatabase db = null;
try{
String dbPath = DB_PATH + DB_NAME;
db = SQLiteDatabase.openDatabase(dbPath, null, SQLiteDatabase.OPEN_READWRITE);
db.setLocale(Locale.getDefault());
db.setLockingEnabled(true);
db.setVersion(DB_VERSION);
}
catch(SQLiteException e){
Log.e("SQL Helper", "database not found");
}
if(db != null){
db.close();
}
return db != null ? true : false;
}
private void copyDataBase(){
InputStream iStream = null;
OutputStream oStream = null;
String outFilePath = DB_PATH + DB_NAME;
try{
iStream = myContext.getAssets().open(DB_NAME);
oStream = new FileOutputStream(outFilePath);
byte[] buffer = new byte[1024];
int length;
while((length = iStream.read(buffer))>0){
oStream.write(buffer,0,length);
}
oStream.flush();
oStream.close();
iStream.close();
}
catch(IOException ioe){
throw new Error("Problem copying database from resource file.");
}
}
public void openDataBase() throws SQLException {
String myPath = DB_PATH + DB_NAME;
myDataBase = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READWRITE);
}
@Override
public synchronized void close(){
if (myDataBase != null)
myDataBase.close();
super.close();
}
}
+0
這個答案是輕微錯誤的:刪除這些行'else if(dbExist){copyDataBase(); }或者即使已經存在,db也會被複制。 – 2015-09-02 09:54:39
相關問題
- 1. Android預填充數據庫
- 2. Android中的預填充數據庫
- 3. Coredata數據庫預填充未填充
- 4. 預填充數據庫
- 5. 使用onUpgrade更新我的預填充SQLite數據庫()
- 6. 更新包含預填充數據庫的應用程序
- 7. 在phonegap中使用預填充的sqlite數據庫android
- 8. 在Android中重置預先填充的sqlite數據庫
- 9. 如何更新appstore中預填充的核心數據(SQLITE3)數據庫
- 10. 自動填充數據庫。(Android /新手)
- 11. 預先填充並更新來自cordova應用(iOS和Android)的SQLite數據庫
- 12. 填充Android SQLite數據庫
- 13. 刪除預填充的數據庫
- 14. 預先填充的Sqlite數據庫
- 15. android預填充數據庫程序中的nullPointerException
- 16. Android - 預填充數據庫,插入還是預加載?
- 17. 在android中填充數據庫的更有效的方法
- 18. 在SQLite數據庫上使用預填充的數據庫Android Studio
- 19. 從Android中的數據庫填充ListView
- 20. 更新置於資產文件夾中的預填充數據庫
- 21. 預填充離子數據庫2
- 22. 預填充工具SQL CE數據庫
- 23. 如何預先填充sqlite數據庫?
- 24. 領域預填充數據庫
- 25. 使用SQL數據庫預填充InfoPath
- 26. 預填充SQLite數據庫中的核心數據關係
- 27. 從CascadingDropDown中的數據庫預填充數據
- 28. Android預打包數據庫更新
- 29. Android - 填充ListView使用預加載的數據庫
- 30. Android |預先填充的數據庫路徑
「但始終複製新數據庫失敗」 - 請界定「總是失敗」。 「我可以直接從資產中打開數據庫嗎?」 - 不,抱歉。 – CommonsWare 2010-11-16 02:07:46