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