簡體   English   中英

數據庫被鎖定的Android

[英]Database getting locked android

我已經使用數據庫存儲了一些信息。為此我創建了兩個表。但是每當我使用數據庫時,我都會收到一條錯誤消息,指出數據庫已被鎖定。我不知道為什么會這樣。即使我已經關閉了數據庫。

數據庫代碼

public class GroupDataBase extends SQLiteOpenHelper {

    private static final int dbVersion = 1;
    private static final String dbName = "HSsuraksha";
    private static final String grouptableName = "groupDetails";
    private static final String contacttableName = "contactDetails";
    private static final String groupId = "groupId";
    private static final String groupName = "groupName";
    private static final String createdOn = "createdOn";
    private static final String contactId = "contactId";
    private static final String contactGroupId = "groupId";
    private static final String contactName = "contactName";
    private static final String contactNumber = "contactNumber";
    private String groupIdValue;
    private ArrayList<String> groupIdList;
    private ArrayList<GroupModel> getGroupInfo;
    private static final String createContactTable = "Create Table " + contacttableName + "(" + contactId + " Integer Primary Key AutoIncrement," + contactGroupId + " Text," + contactName + " Text," + contactNumber + " Text" + ");";
    private static final String createGroupTable = "CREATE TABLE " + grouptableName + "(" + groupId + " Integer Primary Key AutoIncrement," + groupName + " Text," + createdOn + " Text" + ");";


    public GroupDataBase(Context context) {
        super(context, dbName, null, dbVersion);
    }

    @Override
    public void onCreate(SQLiteDatabase sqLiteDatabase) {

        sqLiteDatabase.execSQL(createGroupTable);
        sqLiteDatabase.execSQL(createContactTable);

    }

    @Override
    public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i2) {

//        sqLiteDatabase.execSQL("DROP TABLE IF EXISTS " + contacttableName);
//        sqLiteDatabase.execSQL("DROP TABLE IF EXISTS " + contacttableName);
//        onCreate(sqLiteDatabase);

    }


    public void insertGroupDetails(GroupModel groupModel) {
        SQLiteDatabase database = getWritableDatabase();
        database.beginTransaction();
        ContentValues contentValues = new ContentValues();
        contentValues.put(groupName, groupModel.getGroupName());
        contentValues.put(createdOn, groupModel.getGroupCreatedDate());
        if (contentValues != null) {

            Long id = database.insert(grouptableName, null, contentValues);
            Log.e("Group insert values", "" + id);

        }
        database.setTransactionSuccessful();
        database.endTransaction();
        database.close();

    }

    public ArrayList<String> getGroupId() {
        SQLiteDatabase database = getReadableDatabase();
        String selectID = "Select " + groupId + " From " + grouptableName;
        Cursor c = database.rawQuery(selectID, null);
        groupIdList = new ArrayList<String>();

        while (c.moveToNext()) {
            groupIdValue = c.getString(c.getColumnIndex(groupId));
            groupIdList.add(groupIdValue);
        }

        database.close();

        return groupIdList;
    }

    public ArrayList<GroupModel> getAllGroups() {
        SQLiteDatabase database = getWritableDatabase();
        String query = "Select * From " + grouptableName;
        GroupModel groupModel;
        getGroupInfo = new ArrayList<GroupModel>();
        Cursor c = database.rawQuery(query, null);
        while (c.moveToNext()) {

            groupModel = new GroupModel(c.getString(c.getColumnIndexOrThrow(groupId)), c.getString(c.getColumnIndexOrThrow(groupName)), c.getString(c.getColumnIndexOrThrow(createdOn)));
            getGroupInfo.add(groupModel);

        }
        c.close();
        database.close();
        return getGroupInfo;
    }

    public void insertContacts(ContactModel contactModel, String id, ArrayList<ContactModel> contactModelArrayList) {
        SQLiteDatabase database = getWritableDatabase();
        database.beginTransaction();
        ContentValues contentValues = new ContentValues();
        for (int i = 0; i < contactModelArrayList.size(); i++) {

            contentValues.put(contactName, contactModelArrayList.get(i).getContactName());
            contentValues.put(contactNumber, contactModelArrayList.get(i).getContactNumber());
            contentValues.put(groupId, id);
            if (contentValues != null) {
                Long value = database.insert(contacttableName, id, contentValues);
                Log.e("Insert Contact", "" + value);
            }

        }


        database.setTransactionSuccessful();
        database.close();
    }

    public void selectContacts(String id) {
        String query = "Select * From " + contacttableName + " where " + groupId + "=?";
        SQLiteDatabase database = getReadableDatabase();
        Cursor cursor = database.rawQuery(query, new String[]{id});
        while (cursor.moveToNext()) {
            String contactNameValue = cursor.getString(cursor.getColumnIndexOrThrow(contactName));
            Log.e("Contact Name", "" + contactNameValue);
        }
        cursor.close();
        database.close();

    }


}

我從中訪問數據庫的代碼

case R.id.bt_group_create:
                simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
                date = simpleDateFormat.format(new Date());
                groupModel = new GroupModel(strGroupName, date);
                groupDataBase.insertGroupDetails(groupModel);
                arrayListgroupId = groupDataBase.getGroupId();
                strGroupId = arrayListgroupId.get(arrayListgroupId.size() - 1);
                Log.e("Group Id", "" + strGroupId);

//                contactModel = new ContactModel(contactName, contactNumber);
                groupDataBase.insertContacts(new ContactModel(), strGroupId, contactModelArrayList);

                groupDataBase.selectContacts(strGroupId);


        }

Logcat

08-04 11:36:30.188  24330-24330/example.com.pocketdocs E/SQLiteLog﹕ (5) database is locked
08-04 11:36:32.718  24330-24330/example.com.pocketdocs E/AndroidRuntime﹕ FATAL EXCEPTION: main
    android.database.sqlite.SQLiteDatabaseLockedException: database is locked (code 5)
            at android.database.sqlite.SQLiteConnection.nativeExecuteForLong(Native Method)
            at android.database.sqlite.SQLiteConnection.executeForLong(SQLiteConnection.java:602)
            at android.database.sqlite.SQLiteSession.executeForLong(SQLiteSession.java:652)
            at android.database.sqlite.SQLiteStatement.simpleQueryForLong(SQLiteStatement.java:107)
            at android.database.DatabaseUtils.longForQuery(DatabaseUtils.java:816)
            at android.database.DatabaseUtils.longForQuery(DatabaseUtils.java:804)
            at android.database.sqlite.SQLiteDatabase.getVersion(SQLiteDatabase.java:870)
            at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:242)
            at android.database.sqlite.SQLiteOpenHelper.getReadableDatabase(SQLiteOpenHelper.java:188)
            at example.com.pocketdocs.DataBase.GroupDataBase.selectContacts(GroupDataBase.java:131)
            at example.com.pocketdocs.Group.CreateNewGroup.onClick(CreateNewGroup.java:105)
            at android.view.View.performClick(View.java:4147)
            at android.view.View$PerformClick.run(View.java:17161)
            at android.os.Handler.handleCallback(Handler.java:615)
            at android.os.Handler.dispatchMessage(Handler.java:92)
            at android.os.Looper.loop(Looper.java:213)
            at android.app.ActivityThread.main(ActivityThread.java:4787)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:511)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:789)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:556)
            at dalvik.system.NativeStart.main(Native Method)

Logcat在此行指出錯誤

 SQLiteDatabase database = getReadableDatabase();

解決了問題,這只是我的錯誤

錯誤代碼

public void insertContacts(ContactModel contactModel, String id, ArrayList<ContactModel> contactModelArrayList) {
        SQLiteDatabase database = getWritableDatabase();
        database.beginTransaction();
        ContentValues contentValues = new ContentValues();
        for (int i = 0; i < contactModelArrayList.size(); i++) {

            contentValues.put(contactName, contactModelArrayList.get(i).getContactName());
            contentValues.put(contactNumber, contactModelArrayList.get(i).getContactNumber());
            contentValues.put(groupId, id);
            if (contentValues != null) {
                Long value = database.insert(contacttableName, id, contentValues);
                Log.e("Insert Contact", "" + value);
            }

        }


        database.setTransactionSuccessful();
        database.close();
    }

更正:我忘了打電話給endtransaction,所以我的數據庫obj沒有關閉

public void insertContacts(ContactModel contactModel, String id, ArrayList<ContactModel> contactModelArrayList) {
        database = getWritableDatabase();
        database.beginTransaction();

        try {
            ContentValues contentValues = new ContentValues();
            for (int i = 0; i < contactModelArrayList.size(); i++) {

                contentValues.put(contactName, contactModelArrayList.get(i).getContactName());
                contentValues.put(contactNumber, contactModelArrayList.get(i).getContactNumber());
                contentValues.put(groupId, id);
                if (contentValues != null) {
                    Long value = database.insert(contacttableName, id, contentValues);
                    Log.e("Insert Contact", "" + value);
                }

            }
        } catch (Exception e) {

        } finally {
            database.setTransactionSuccessful();
            database.endTransaction();
            database.close();
        }

嘗試寫入數據庫時​​,也許這是另一個寫入數據庫的線程。

有關更多信息,請參見Android數據庫鎖定

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM