2014-03-04 35 views
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表在開始時是空的,我在運行時向它添加數據。

感謝

回答

1

DBExists()方法不正確。您應該使用

return mContext.getDatabasePath(DB_NAME).exists(); 

截至目前,你從你的資產文件夾在您的應用程序的每個重啓的版本覆蓋你的數據庫。最後,你從你的createDB()方法中刪除this.getReadableDatabase();,因爲它是不必要的。

+0

那麼,工作非常感謝!但我不明白爲什麼它可以在預填充的桌面產品上正常工作,但不能在桌面上使用。你說我用資產文件夾中的版本覆蓋數據庫,但不是好的,因爲我向locallist表中添加了一些數據?我的意思是,插入的數據是不是保存到資產文件夾中的數據庫中? – yrazlik

+0

基本上發生的事情是,您從資產文件夾中取出了數據庫,創建了一個文件,然後寫入該文件。通過使用錯誤的DB存在方法,您最終基本上刪除了DB(以及所有新的本地更改),並從資產中重新複製了僅限產品的數據庫版本。資產文件夾實際上是隻讀的。事實上,你的代碼是將數據庫複製到android數據庫路徑來解決這個問題。 –

+0

謝謝,現在有道理 – yrazlik

相關問題