2013-04-07 89 views
-2

當我在App中創建SQLiteDatabase並向表中插入數據時。這是拋出一個錯誤告訴我,數據庫被鎖定。關於數據庫被鎖定

public class DButils { 

// 
private DBopenHelper mySqliteDBHelper; 
private Context myContext; 
static SQLiteDatabase mySqliteDatabase; 
// 
private static String strDBName = "kar.db"; 
private static int version = 1; 
// 
private static String strTblName = "people"; 
private static String strId = "id"; 
private static String strUser = "name"; 
private static String strSalary = "salary"; 
private static String strRecorddate = "date"; 

private static String strSql = "create table " + strTblName + " (" + strId 
     + " integer primary key , " + strUser + " text not null, " 
     + strSalary + " integer," + strRecorddate + " text);"; 

public DButils(Context myContext) { 
    this.myContext = myContext; 
    mySqliteDBHelper = new DBopenHelper(myContext, strDBName, null, version); 
} 

// Open 
public void OpenDB() { 
    // 
    if (mySqliteDBHelper != null) 
     mySqliteDatabase = mySqliteDBHelper.getWritableDatabase(); 
} 

/** 
* insert 
* 
* @param user 
* @return 
*/ 
public long inSert(TblUser user) { 
    ContentValues convalues = new ContentValues(); 
    convalues.put(strId, user.getId()); 
    convalues.put(strUser, user.getName()); 
    convalues.put(strSalary, user.getSalary()); 
    convalues.put(strRecorddate, user.getRecordDate()); 
    return mySqliteDatabase.insert(strTblName, null, convalues); 
} 

/** 
* select 
*/ 
public TblUser[] selectAll() { 
    Cursor cursor = mySqliteDatabase.query(strTblName, new String[] { 
      strId, strUser, strSalary, strRecorddate }, null, null, null, 
      null, null); 

    return convert(cursor); 
} 

/** 
* select a data 
*/ 

public TblUser[] selectOne(int id) { 
    Cursor cursor = mySqliteDatabase.query(strTblName, new String[] { 
      strId, strUser, strSalary, strRecorddate }, "id" + id, null, 
      null, null, null); 
    return convert(cursor); 
} 

/** 
* change 
*/ 
public TblUser[] convert(Cursor cursor) { 
    // 
    int RecordCount = cursor.getCount(); 
    // 
    if ((RecordCount == 0) && (!cursor.moveToFirst())) { 
     // 
     return null; 
    } 

    TblUser[] tbluser = new TblUser[RecordCount]; 

    for (int i = 0; i < RecordCount; i++) { 
     cursor.moveToNext(); 
     tbluser[i] = new TblUser(); 
     tbluser[i].setId(cursor.getInt(0)); 
     tbluser[i].setName(cursor.getString(1)); 
     tbluser[i].setSalary(cursor.getInt(2)); 
     tbluser[i].setRecordDate(cursor.getString(3)); 
    } 
    return tbluser; 

} 

// close 
public void DBclose() { 
    if (mySqliteDatabase != null) { 
     mySqliteDatabase.close(); 
     mySqliteDatabase = null; 
    } 
} 

// helper 
public class DBopenHelper extends SQLiteOpenHelper { 

    public DBopenHelper(Context context, String name, 
      CursorFactory factory, int version) { 

     super(context, name, factory, version); 
     // TODO Auto-generated constructor stub 
     System.out.println("doing construct"); 
    } 

    @SuppressLint("SdCardPath") 
    @Override 
    public void onCreate(SQLiteDatabase db) { 
     // TODO Auto-generated method stub 
     System.out.println("doing oncreate"); 
     SQLiteDatabase.openOrCreateDatabase(
       "/data/data/com.example.ch_2013_3_19sqlite/databases/" 
         + strDBName, null); 
     db.execSQL(strSql); 

    } 

    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
     // TODO Auto-generated method stub 
     db.execSQL("drop table if exists " + strDBName); 

    } 

} 

}

然後我嘗試在活動打開數據庫:

DButils db; 
//btn 
private Button btnSave; 
private Button btnRead; 

//textView 
private TextView textView; 
btnOnclick mybtnonclick; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    mybtnonclick=new btnOnclick(); 
    btnSave=(Button)findViewById(R.id.button1); 
    btnRead=(Button)findViewById(R.id.button2); 
    btnSave.setOnClickListener(mybtnonclick); 
    btnRead.setOnClickListener(mybtnonclick); 

    textView=(TextView)findViewById(R.id.textView2); 


    db=new DButils(this); 


} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    // Inflate the menu; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.main, menu); 
    return true; 
} 

class btnOnclick implements OnClickListener{ 

    @Override 
    public void onClick(View v) { 
     // TODO Auto-generated method stub 
     if(v==btnSave){ 

      db.OpenDB(); 
      TblUser user=new TblUser(); 
      user.setId(10); 
      user.setName("mario"); 
      user.setSalary(100); 
      user.setRecordDate("2013-2-22"); 
      db.inSert(user); 
      db.DBclose(); 

     } 
     if(v==btnRead){ 
      db.OpenDB(); 
      TblUser[] tbl=db.selectAll(); 
      String str="name: "+tbl[0].getName()+" id:"+ 
      tbl[0].getId()+" salary:"+tbl[0].getSalary()+ 
      " date :"+tbl[0].getRecordDate(); 

      textView.setText(str); 
      db.DBclose(); 
     } 
    } 

} 

,它是拋出一個錯誤的數據庫是looked.the拋出期間按鈕onClicked。如何處理?

+0

您是否在清單中給了必需的權限? – MeNa 2013-04-07 21:46:37

+0

@MeNa沒有使用數據庫的權限。 – 2013-04-07 21:47:09

+0

請發佈異常stacktrace從logcat(老問題從近票投票審查隊列) – laalto 2014-03-10 09:59:41

回答

1

它拋出一個錯誤顯示我數據庫被鎖定。

也許你忘了關你的數據庫或當另一個線程訪問(並做了一些工作)到你的數據庫,當你正試圖從實際線程處理它這個問題occures。

請確保您連接到數據庫只從一個線程在時間(一次連接)。您無法同時處理來自不同線程的數據庫。

注意:如果您正在創建併發應用程序,那麼使用同步塊和方法是一種很好的做法。

+0

不,只有一個主線程活動。沒有其他線程。我只是捍衛類包括延伸SQLiteOpenHelper的內部類我找到罰球happended在SQLiteOpenHelper OnCreate中,當它做SQLiteDatabase.openOrCreateDatabase( \t \t \t \t \t「/data/data/com.example.ch_2013_3_19sqlite/databases/」 \t \t \t \t \t \t \t + strDBName,null); – Mryoun 2013-04-07 22:37:59

+0

@Mryoun檢查你沒有打開你的數據庫或在這裏添加完整的java代碼。 – Sajmon 2013-04-07 22:45:39

+0

會不會告訴我你的電子郵件地址?有限的字數 – Mryoun 2013-04-07 22:57:10