0
我是新來的Android SQLite。我無法從資產文件夾升級數據庫android
我在我的資產文件夾中有aowdb.db。
爲什麼問?因爲當我調試我的應用程序時,每次更新db文件時,我都需要從設備上卸載應用程序才能強制更新。當用戶從Play商店更新我的應用程序時,用戶是否也需要這樣做?我很害怕。
這是我的代碼:
DatabaseHelper
public class DatabaseHelper extends SQLiteOpenHelper {
public static final String DBNAME = "aowdb.db";
public static final int DBVERSION = 2;
public static final String DBLOCATION = "/data/data/com.exercises.example/databases/";
public static final String TABLE_EXERCICE = "EXERCISE";
// Exercise Table Columns names
private static final String KEY_ID = "ID";
private static final String KEY_NAME = "NAME";
private static final String KEY_PR_MUSCLE = "PR_MUSCLE";
private static final String KEY_SC_MUSCLE = "SC_MUSCLE";
private Context mContext;
private SQLiteDatabase mDatabase;
public DatabaseHelper(Context context) {
super(context, DBNAME, null, DBVERSION);
this.mContext = context;
}
@Override
public void onCreate(SQLiteDatabase db) {
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
public void openDatabase() {
String dbPath = mContext.getDatabasePath(DBNAME).getPath();
if (mDatabase != null && mDatabase.isOpen()) {
return;
}
mDatabase = SQLiteDatabase.openDatabase(dbPath, null, SQLiteDatabase.OPEN_READWRITE);
}
public void closeDatabase() {
if (mDatabase != null) {
mDatabase.close();
}
}
public ExerciseInfo getExerciseInfo(int id) {
SQLiteDatabase db = this.getReadableDatabase();
Cursor cursor = db.query(TABLE_EXERCICE, new String[]{KEY_ID,
KEY_NAME, KEY_PR_MUSCLE, KEY_SC_MUSCLE,}, KEY_ID + "=?",
new String[]{String.valueOf(id)}, null, null, null, null);
if (cursor != null)
cursor.moveToFirst();
ExerciseInfo exercise = new ExerciseInfo(cursor.getInt(0), cursor.getString(1), cursor.getString(2), cursor.getString(3));
return exercise;
}
}
MainActivity
public class MainActivity extends AppCompatActivity {
public DatabaseHelper mDBHelper;
ExerciseInfo exerciseInfo;
int ex_id = 1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mDBHelper = new DatabaseHelper(this);
//Check exists database
File database = getApplicationContext().getDatabasePath(DatabaseHelper.DBNAME);
if(false == database.exists()) {
mDBHelper.getReadableDatabase();
//Copy db
if(copyDatabase(this)) {
Toast.makeText(this, "Copy database succes", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(this, "Copy data error", Toast.LENGTH_SHORT).show();
return;
}
}
exerciseInfo = mDBHelper.getExerciseInfo(ex_id);
}
private boolean copyDatabase(Context context) {
try {
InputStream inputStream = context.getAssets().open(DatabaseHelper.DBNAME);
String outFileName = DatabaseHelper.DBLOCATION + DatabaseHelper.DBNAME;
OutputStream outputStream = new FileOutputStream(outFileName);
byte[]buff = new byte[1024];
int length = 0;
while ((length = inputStream.read(buff)) > 0) {
outputStream.write(buff, 0, length);
}
outputStream.flush();
outputStream.close();
Log.w("MainActivity","DB copied");
return true;
}catch (Exception e) {
e.printStackTrace();
return false;
}
}
}
ExerciseInfo.class
public class ExerciseInfo {
private int id;
private String name;
private String pr_muscle;
private String sec_muscle;
public ExerciseInfo(int id, String name, String pr_muscle, String sec_muscle) {
this.id = id;
this.name = name;
this.pr_muscle = pr_muscle;
this.sec_muscle = sec_muscle;
}
public int getId() {
return id;
}
public String getName() {
return name;
}
public String getPr_muscle() {
return pr_muscle;
}
public String getSec_muscle() {
return sec_muscle;
}
}
'當用戶從Play商店更新我的應用程序時,用戶是否需要這樣做?'是的,如果每次提供更改的數據庫。在資產文件夾中提供數據庫僅在您爲其提供一些數據時纔有用。否則,只需在第一次運行應用程序時在運行時創建它。 –
只需使用[SQLiteAssetHelper](https://github.com/jgilfelt/android-sqlite-asset-helper)。這就是'onUpdate'的用途。 –
每次啓動應用程序時,只需盲目地將資產數據庫從資產複製到目的地。在訪問數據庫之前執行此操作。 – greenapps