2014-02-09 50 views
0

我有兩個類「StaffListDB」和「CostCentreListDB」,它們是兩個表結構。我已經提到兩個類的DataBase名稱都是「B」。當我嘗試從ASYNC任務寫入這些表時,它給我一個錯誤。我試圖從兩個單獨的ASYNC任務寫入這些表仍然是同樣的問題。 但是,當我將其中一個DataBase名稱更改爲「B」以外的任何其他名稱來表示「DB」時,它可以正常工作。任何幫助建議非常感謝。謝謝。問題:在一個數據庫中寫入兩個不同的表格

My database classes: 
public class StaffListDB { 

    private static final String KEY_STAFFID = "StaffId"; 
    private static final String KEY_STAFFNAME = "StaffName"; 

    private static final String DATABASE_NAME = "B"; 
    private static final String DATABASE_TABLE = "StaffList"; 
    private static final int DATABASE_VERSION = 1; 

    private DBStaffListHelper staffListHelper; 
    private final Context staffListContext; 
    private SQLiteDatabase staffListDatabase; 

    private static class DBStaffListHelper extends SQLiteOpenHelper { 

     public DBStaffListHelper(Context context) { 
      super(context, DATABASE_NAME, null, DATABASE_VERSION); 

     } 

     @Override 
     public void onCreate(SQLiteDatabase db) { 
      db.execSQL("CREATE TABLE " + DATABASE_TABLE + " (" + KEY_STAFFID 
        + " TEXT NOT NULL, " + KEY_STAFFNAME + " TEXT NOT NULL);" 
        ); 

     } 

     @Override 
     public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
      db.execSQL("DROP TABLE IF EXISTS " + DATABASE_TABLE); 
      onCreate(db); 

     } 

    } 

    public StaffListDB (Context c){ 
     staffListContext = c; 
    } 

    public StaffListDB open() throws SQLException{ 
     staffListHelper = new DBStaffListHelper(staffListContext); 
     staffListDatabase = staffListHelper.getWritableDatabase(); 
     return this;   
    } 

    public void close(){ 
     staffListHelper.close(); 
    } 

    public long createStaffEntry(String staffIdd, String name) { 
     ContentValues cv = new ContentValues(); 
     cv.put(KEY_STAFFID, staffIdd); 
     cv.put(KEY_STAFFNAME, name);   
     return staffListDatabase.insert(DATABASE_TABLE, null, cv);  
    } 

    public String getStaffData() { 
     String[] columns = new String[]{KEY_STAFFID, KEY_STAFFNAME}; 
     Cursor c = staffListDatabase.query(DATABASE_TABLE, columns, null, null, null, null, null); 

     String result = ""; 

     int iStaffId = c.getColumnIndex(KEY_STAFFID); 
     int iStaffName = c.getColumnIndex(KEY_STAFFNAME); 


     for(c.moveToFirst(); !c.isAfterLast();c.moveToNext()){ 
      result = result + c.getString(iStaffId) + " " + c.getString(iStaffName) + "\n"; 
     } 


     return result; 
    } 

    public void deleteTable() throws SQLException{ 
     staffListDatabase.execSQL("DELETE FROM " + DATABASE_TABLE); 
    } 

} 

public class CostCentreListDB { 

    private static final String KEY_COSTCODE = "CostCode"; 
    private static final String KEY_COSTCODENAME = "CCName"; 

    private static final String DATABASE_NAME= "B"; 
    private static final String DATABASE_TABLE = "CostCentreListTable"; 
    private static final int DATABASE_VERSION = 1; 

    private DBCCListHelper ccListHelper; 
    private final Context ccListContext; 
    private SQLiteDatabase ccListDatabase; 


    private static class DBCCListHelper extends SQLiteOpenHelper{ 

     public DBCCListHelper(Context context) { 
      super(context, DATABASE_NAME, null, DATABASE_VERSION); 

     } 

     @Override 
     public void onCreate(SQLiteDatabase db) { 
      db.execSQL("CREATE TABLE "+ DATABASE_TABLE + " (" + 
        KEY_COSTCODE + " TEXT NOT NULL, " + 
        KEY_COSTCODENAME + " TEXT NOT NULL);" 
        ); 

     } 

     @Override 
     public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
      db.execSQL("DROP TABLE IF EXISTS " + DATABASE_TABLE); 
      onCreate(db); 


     } 

    } 

    public CostCentreListDB (Context c){ 
     ccListContext = c; 
    } 

    public CostCentreListDB open() throws SQLException{ 
     ccListHelper = new DBCCListHelper(ccListContext); 
     ccListDatabase = ccListHelper.getWritableDatabase(); 
     return this;   
    } 

    public void close(){ 
     ccListHelper.close(); 
    } 

    public long createCCEntry(String costCode, String costCodeName) { 
     ContentValues cv = new ContentValues(); 
     cv.put(KEY_COSTCODE, costCode); 
     cv.put(KEY_COSTCODENAME, costCodeName);  
     return ccListDatabase.insert(DATABASE_TABLE, null, cv);  
    } 

    public String getCCData() { 
     String[] columns = new String[]{KEY_COSTCODE, KEY_COSTCODENAME}; 
     Cursor c = ccListDatabase.query(DATABASE_TABLE, columns, null, null, null, null, null); 
     String result = ""; 

     int iCostCode = c.getColumnIndex(KEY_COSTCODE); 
     int iCostCodeName = c.getColumnIndex(KEY_COSTCODENAME); 


     for(c.moveToFirst(); !c.isAfterLast();c.moveToNext()){ 
      result = result + c.getString(iCostCode) + " " + c.getString(iCostCodeName) + "\n"; 
     } 


     return result; 
    } 


} 

異步任務: 公共類SaveServerInfoInDataBase擴展的AsyncTask {

 @Override 
     protected Void doInBackground(String... params) { 
      String staffId = params[0]; 
      String staffName = params[1]; 
      for(int i = 0; i<=10; i++){ 

      StaffListDB saveStaffList = new StaffListDB(MainActivity.this); 
      saveStaffList.open(); 
      //saveStaffList.deleteTable(); 
      saveStaffList.createStaffEntry(staffId + i, staffName + i); 
      saveStaffList.close();   

      CostCentreListDB saveCC = new CostCentreListDB(MainActivity.this); 
      saveCC.open(); 
      saveCC.createCCEntry("200" + i, "IT" + i); 
      saveCC.close(); 

      } 
      return null; 
     }  

    } 

的logcat:

02-09 11:20:42.778: E/SQLiteLog(7104): (1) no such table: CostCentreListTable 
02-09 11:20:43.068: E/SQLiteDatabase(7104): Error inserting CostCode=2000 CCName=IT0 
02-09 11:20:43.068: E/SQLiteDatabase(7104): android.database.sqlite.SQLiteException: no such table: CostCentreListTable (code 1): , while compiling: INSERT INTO CostCentreListTable(CostCode,CCName) VALUES (?,?) 
02-09 11:20:43.068: E/SQLiteDatabase(7104):  at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method) 
02-09 11:20:43.068: E/SQLiteDatabase(7104):  at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:1108) 
02-09 11:20:43.068: E/SQLiteDatabase(7104):  at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:681) 
02-09 11:20:43.068: E/SQLiteDatabase(7104):  at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:589) 
02-09 11:20:43.068: E/SQLiteDatabase(7104):  at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:58) 
02-09 11:20:43.068: E/SQLiteDatabase(7104):  at android.database.sqlite.SQLiteStatement.<init>(SQLiteStatement.java:31) 
02-09 11:20:43.068: E/SQLiteDatabase(7104):  at android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:1573) 
02-09 11:20:43.068: E/SQLiteDatabase(7104):  at android.database.sqlite.SQLiteDatabase.insert(SQLiteDatabase.java:1445) 
02-09 11:20:43.068: E/SQLiteDatabase(7104):  at com.example.testsqlite.CostCentreListDB.createCCEntry(CostCentreListDB.java:69) 
02-09 11:20:43.068: E/SQLiteDatabase(7104):  at com.example.testsqlite.MainActivity$SaveServerInfoInDataBase.doInBackground(MainActivity.java:90) 
02-09 11:20:43.068: E/SQLiteDatabase(7104):  at com.example.testsqlite.MainActivity$SaveServerInfoInDataBase.doInBackground(MainActivity.java:1) 
02-09 11:20:43.068: E/SQLiteDatabase(7104):  at android.os.AsyncTask$2.call(AsyncTask.java:287) 
02-09 11:20:43.068: E/SQLiteDatabase(7104):  at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305) 
02-09 11:20:43.068: E/SQLiteDatabase(7104):  at java.util.concurrent.FutureTask.run(FutureTask.java:137) 
02-09 11:20:43.068: E/SQLiteDatabase(7104):  at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230) 
02-09 11:20:43.068: E/SQLiteDatabase(7104):  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076) 
02-09 11:20:43.068: E/SQLiteDatabase(7104):  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569) 
02-09 11:20:43.068: E/SQLiteDatabase(7104):  at java.lang.Thread.run(Thread.java:856) 
+0

爲什麼要創建2個擴展SQLiteOpenHelper的嵌套類? 只創建一個類,並處理它中的所有數據庫。 –

+1

@udi。是的,現在它已經運行良好了。謝謝 – BRDroid

回答

0

使用兩個不同的數據庫連接寫入同一個數據庫文件是不正確的。當您嘗試使用不同的連接同時寫入文件時,您將遇到數據庫鎖定異常。

您必須確保您使用的是一個數據庫連接。你可以實現一個擴展SQLiteOpenHelper的單例數據庫助手。

public class DataBaseHelper extends SQLiteOpenHelper { 

    public static final int DATABASE_VERSION = 1; 
    public static final String DATABASE_NAME = "db_name"; 

    private static DataBaseHelper mInstance = null; 

    private DataBaseHelper(Context context) { 
     super(context, DATABASE_NAME, null, DATABASE_VERSION); 
    } 

    public static DataBaseHelper getInstance(Context context) { 
     if (mInstance == null) 
      mInstance = new DataBaseHelper(context.getApplicationContext()); 

     return mInstance; 
    } 

    @Override 
    public void onCreate(SQLiteDatabase db) {/* ... */} 

    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {/* ... */} 

} 

然後使用擴展的類的任何地方

public class StaffListDAO { 

    private DataBaseHelper mDbHelper; 

    public static String TableName = "StaffList"; 

    private static final String KEY_STAFFID = "StaffId"; 
    private static final String KEY_STAFFNAME = "StaffName"; 

    private StaffListDAO(Context context) { 
     mDbHelper = DataBaseHelper.getInstance(context); 
    } 

    public static StaffListDAO getInstance(Context context) { 
     return new StaffListDAO(context); 
    } 

    public void insert(Staff item) { 

     SQLiteDatabase db = mDbHelper.getWritableDatabase(); 

     ContentValues values = new ContentValues(); 

     // fill values 

     db.insert(TableName, null, values); 
    } 

} 

請注意,我通常不關閉數據庫連接,因爲當應用程序是完成它會自動釋放。你可以實現一個ref計數器來處理db連接關閉。

+0

謝謝你的寶貴意見。是的,我做了必要的改變,現在它的工作非常好。 – BRDroid

相關問題