【问题标题】:about database is locked [duplicate]关于数据库被锁定[重复]
【发布时间】:2013-04-07 21:38:46
【问题描述】:

当我在 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);

    }

}

}

然后我尝试在 Activity 中打开数据库:

 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();
        }
    }

}

并且在查找数据库时会抛出错误。在单击按钮期间会抛出错误。怎么处理?

【问题讨论】:

  • 您是否在清单中授予了所需的权限?
  • @MeNa 没有使用数据库的权限。
  • 请从 logcat 中发布异常堆栈跟踪(关闭投票审查队列中的旧问题)

标签: android database


【解决方案1】:

这是一个错误,告诉我数据库已锁定。

您可能忘记关闭数据库,或者当您尝试从实际线程处理数据库时,当另一个线程访问(并做一些工作)您的数据库时会发生此问题。

确保您一次仅从一个线程(一次连接一个)连接到数据库。您不能同时处理来自不同线程的数据库。

注意:如果您正在创建并发应用程序,最好使用同步块和方法。

【讨论】:

  • 不,该活动只有一个 MainThread。没有另一个线程。我只是保护一个包含扩展 SQLiteOpenHelper 的内部类的类我发现在 SQLiteOpenHelper 中的 oncreate 中发生了抛出,当它执行 SQLiteDatabase.openOrCreateDatabase("/data/data/com.example.ch_2013_3_19sqlite/databases/" + strDBName, null);跨度>
  • @Mryoun 检查你的数据库没有打开或在此处添加完整的 java 代码。
  • 你想告诉我你的电子邮件地址吗?字数有限
  • @Mryoun 编辑您的问题并发布相关代码 - 您正在处理数据库的位置。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-22
  • 2011-10-30
  • 2018-06-10
相关资源
最近更新 更多