我最近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. 如何更新appstore中預填充的核心數據(SQLITE3)數據庫
- 3. android預填充數據庫程序中的nullPointerException
- 4. 領域預填充數據庫
- 5. 預填充工具SQL CE數據庫
- 6. 使用SQL數據庫預填充InfoPath
- 7. 預填充離子數據庫2
- 8. Android - 填充ListView使用預加載的數據庫
- 9. Android ORMLite,使用預先填充的數據庫並使用它
- 10. 預填充SQLite數據庫中的核心數據關係
- 11. 的Android的LinearLayout填充從數據庫
- 12. 在coredata中預先填充數據
- 13. 在html中預填充jQuery數據
- 14. 如何在UWP中使用預填充的sqlite數據庫?
- 15. 在領域中使用預填充的數據庫
- 16. 在Phonegap中訪問預先填充的SQL Lite數據庫
- 17. 如何在qwebview中使用預填充的sqlite數據庫?
- 18. 如何在Ionic2中使用預填充的SQLite數據庫?
- 19. iPhone:核心數據:在未來的應用程序版本中更新預填充的數據庫
- 20. PhoneGap + android,預填充數據庫不工作。
- 21. 用數據預填充UITextView?
- 22. Android中的預填充數據庫:試圖將這些部分放在一起
- 23. 如何在Cordova Android項目中使用預填充的Sqlite數據庫
- 24. 如何在coredata上下文中使用預填充數據庫
- 25. 如何在Windows Phone 8.1中處理預填充數據庫
- 26. 使用Django預填充SQLite核心數據的數據庫
- 27. Android SQLite數據庫沒有填充
- 28. Android Studio將數據庫填充到RecyclerVIew
- 29. Android - 填充ListActivity數據庫搜索 - HowTo?
- 30. 從CSV文件填充Android數據庫?
「但始終複製新數據庫失敗」 - 請界定「總是失敗」。 「我可以直接從資產中打開數據庫嗎?」 - 不,抱歉。 – CommonsWare 2010-11-16 02:07:46