我有兩個類「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)
爲什麼要創建2個擴展SQLiteOpenHelper的嵌套類? 只創建一個類,並處理它中的所有數據庫。 –
@udi。是的,現在它已經運行良好了。謝謝 – BRDroid