1
我看過類似的問題,並提供瞭解決方案,但我仍然遇到問題。我有一個SQLite數據庫和地方在我的計劃,我執行插入操作:當應用程序重新啓動時,Android Sqlite插入的數據不會持久
dbHelper = MyDBHelper.getInstance(context);
SQLiteDatabase db = dbHelper.getWritableDatabase();
ContentValues values = new ContentValues();
values.put("listname", "examplelist"); // inserting a string
values.put("productname", textPart); // inserting an int
values.put("productprice", pricePart); // inserting an int// Inserting Row
db.insert("locallist", null, values);
在這一點上,當我查詢數據庫,我看到,該行已經插入。然後,我收我的應用程序,然後再次打開它,並在主要活動的onCreate方法,我做到以下幾點:
MyDBHelper dbHelper;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
dbHelper = MyDBHelper.getInstance(this);
String [] searchResultsByListname = dbHelper.QueryByListName("examplelist");
}
但此查詢將返回一個空數組。這裏是MyDBHelper類:
public class MyDBHelper extends SQLiteOpenHelper {
private static MyDBHelper mInstance = null;
private static final int DB_VERSION = 5;
private static final String DB_NAME = "database.sqlite";
static final String TABLE_NAME = "PRODUCTS";
private final Context mContext;
private static SQLiteDatabase myWritableDb;
// private static String DATABASE_PATH;
public static MyDBHelper getInstance(Context ctx) {
if (mInstance == null) {
mInstance = new MyDBHelper(ctx.getApplicationContext());
// DATABASE_PATH = ctx.getPackageName();
}
return mInstance;
}
private MyDBHelper(Context context) {
super(context, DB_NAME, null, DB_VERSION);
this.mContext = context;
}
@Override
public void onCreate(SQLiteDatabase sqLiteDatabase) {
}
public void createDatabase() throws IOException {
createDB();
}
private void createDB() throws IOException {
boolean dbExist = DBExists();
if (!dbExist) {
this.getReadableDatabase();
copyDBFromResource();
}
}
private boolean DBExists() {
File dbFile = new File(/* DATABASE_PATH + */DB_NAME);
return dbFile.exists();
}
private void copyDBFromResource() throws IOException {
InputStream inputStream = null;
OutputStream outStream = null;
String dbFilePath = DB_NAME;
try {
inputStream = mContext.getAssets().open(DB_NAME);
outStream = new FileOutputStream(mContext.getDatabasePath(DB_NAME));
byte[] buffer = new byte[1024];
int length;
while ((length = inputStream.read(buffer)) > 0) {
outStream.write(buffer, 0, length);
}
outStream.flush();
outStream.close();
inputStream.close();
} catch (Exception ex) {
System.out.println(ex.getMessage());
}
}
public String[] QueryByListName(String listname) {
SQLiteDatabase db = this.getWritableDatabase();
String query = "select productname, productimage,productprice from locallist where listname = '"+listname+"'";
Cursor cursor = db.rawQuery(query, null);
String[] searchResult= new String[cursor.getCount()];
String[] searchResultNoFound= new String[1];
String searchResultSingleLine="";
int index=0;
while (cursor.moveToNext()) {
for (int i = 0; i < cursor.getColumnCount(); i++) {
searchResultSingleLine += cursor.getString(i) + ";";
}
searchResult[index]=searchResultSingleLine; index++;
searchResultSingleLine="";
}
searchResultNoFound[0]="Urun Bulunamadi";
if(cursor.getCount()>0)
return searchResult;
else
return searchResultNoFound;
}
}
我檢查是否應用程序啓動時存在的表,我相信該表存在,但它是空的。那麼,爲什麼我的插入數據在應用程序關閉時不能保留?誰能幫我?
注意:我的數據庫「database」位於我的資產文件夾中,它有兩個表:PRODUCTS和locallist。 PRODUCTS表是預先填充的,我可以毫無問題地使用它,但locallist表在開始時是空的,我在運行時向它添加數據。
感謝
那麼,工作非常感謝!但我不明白爲什麼它可以在預填充的桌面產品上正常工作,但不能在桌面上使用。你說我用資產文件夾中的版本覆蓋數據庫,但不是好的,因爲我向locallist表中添加了一些數據?我的意思是,插入的數據是不是保存到資產文件夾中的數據庫中? – yrazlik
基本上發生的事情是,您從資產文件夾中取出了數據庫,創建了一個文件,然後寫入該文件。通過使用錯誤的DB存在方法,您最終基本上刪除了DB(以及所有新的本地更改),並從資產中重新複製了僅限產品的數據庫版本。資產文件夾實際上是隻讀的。事實上,你的代碼是將數據庫複製到android數據庫路徑來解決這個問題。 –
謝謝,現在有道理 – yrazlik