2013-04-07 78 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