簡體   English   中英

“數據庫被鎖定”即使我調用了database.close()

[英]“Database is locked” Even though I did call database.close()

我想要完成的事情:

我只是想通過SQLite存儲數據。 我讓用戶創建自己的列表。

列表存儲的值是String,int和ArrayList(目前暫不使用)。

我正在處理的事情:

在我完成設置SQLite並運行我的程序后,我遇到了這個錯誤:

android.database.sqlite.SQLiteDatabaseLockedException: database is locked (code 5): , while compiling: PRAGMA journal_mode

因此,在做了一些研究之后, 由於數據庫沒有關閉問題就發生了。 但是,這是事情:

private Context mContext;
private EasyListSQLiteHelper mEasyListSQLiteHelper;

public EasyListDataSource(Context context) {
    mContext = context;
    mEasyListSQLiteHelper = new EasyListSQLiteHelper(context);
}

private SQLiteDatabase open() {
    return mEasyListSQLiteHelper.getWritableDatabase();
}

private void close(SQLiteDatabase database) {
    database.close();
}

public ArrayList<ListItem> read() {
    ArrayList<ListItem> listItems = readList();
    return listItems;
}

public ArrayList<ListItem> readList() {
    SQLiteDatabase database = open();

    Cursor cursor = database.query(
            EasyListSQLiteHelper.LISTS_TABLE,
            new String[] {EasyListSQLiteHelper.LISTS_NAME, BaseColumns._ID, EasyListSQLiteHelper.LISTS_CHECKED},
            null,
            null,
            null,
            null,
            null);

    ArrayList<ListItem> list = new ArrayList<ListItem>();
    if (cursor.moveToFirst()) {
        do {
            ListItem listItem = new ListItem(getIntFromColumnName(cursor, BaseColumns._ID),
                    getStringFromColumnName(cursor, EasyListSQLiteHelper.LISTS_NAME),
                    getIntFromColumnName(cursor, EasyListSQLiteHelper.LISTS_CHECKED),
                    null);
            list.add(listItem);
        }while(cursor.moveToNext());
    }
    cursor.close();
    close(database);
    return list;
}

private int getIntFromColumnName(Cursor cursor, String columnName) {
    int columnIndex = cursor.getColumnIndex(columnName);
    return cursor.getInt(columnIndex);
}

private String getStringFromColumnName(Cursor cursor, String columnName) {
    int columnIndex = cursor.getColumnIndex(columnName);
    return cursor.getString(columnIndex);
}

public void create(ListItem item) {
    SQLiteDatabase database = open();
    database.beginTransaction();

    ContentValues contentValues = new ContentValues();
    contentValues.put(EasyListSQLiteHelper.LISTS_NAME, item.getListName());
    contentValues.put(EasyListSQLiteHelper.LISTS_CHECKED, item.getImportant());
    database.insert(EasyListSQLiteHelper.LISTS_TABLE, null, contentValues);

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

如您所見,我確實關閉了數據庫。 那時我不確定我做錯了什么。 這不是我收到錯誤的唯一地方(注釋我遇到錯誤的行):

數據源:

private Context mContext;
private EasyListSQLiteHelper mEasyListSQLiteHelper;

public EasyListDataSource(Context context) {
    mContext = context;
    mEasyListSQLiteHelper = new EasyListSQLiteHelper(context);
}

private SQLiteDatabase open() {
    // return mEasyListSQLiteHelper.getWritableDatabase();
}

private void close(SQLiteDatabase database) {
    database.close();
}

public ArrayList<ListItem> read() {
    ArrayList<ListItem> listItems = readList();
    return listItems;
}

public ArrayList<ListItem> readList() {
    SQLiteDatabase database = open();

    Cursor cursor = database.query(
            EasyListSQLiteHelper.LISTS_TABLE,
            new String[] {EasyListSQLiteHelper.LISTS_NAME, BaseColumns._ID, EasyListSQLiteHelper.LISTS_CHECKED},
            null,
            null,
            null,
            null,
            null);

    ArrayList<ListItem> list = new ArrayList<ListItem>();
    if (cursor.moveToFirst()) {
        do {
            ListItem listItem = new ListItem(getIntFromColumnName(cursor, BaseColumns._ID),
                    getStringFromColumnName(cursor, EasyListSQLiteHelper.LISTS_NAME),
                    getIntFromColumnName(cursor, EasyListSQLiteHelper.LISTS_CHECKED),
                    null);
            list.add(listItem);
        }while(cursor.moveToNext());
    }
    cursor.close();
    close(database);
    return list;
}

private int getIntFromColumnName(Cursor cursor, String columnName) {
    int columnIndex = cursor.getColumnIndex(columnName);
    return cursor.getInt(columnIndex);
}

private String getStringFromColumnName(Cursor cursor, String columnName) {
    int columnIndex = cursor.getColumnIndex(columnName);
    return cursor.getString(columnIndex);
}

public void create(ListItem item) {
    // SQLiteDatabase database = open();
    database.beginTransaction();

    ContentValues contentValues = new ContentValues();
    contentValues.put(EasyListSQLiteHelper.LISTS_NAME, item.getListName());
    contentValues.put(EasyListSQLiteHelper.LISTS_CHECKED, item.getImportant());
    database.insert(EasyListSQLiteHelper.LISTS_TABLE, null, contentValues);

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

主要活動:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_lists);

    // Initialize variables...
    mAddListImageView = (ImageView) findViewById(R.id.addListImageView);
    mColorImageView = (ImageView) findViewById(R.id.colorImageView);
    mRecyclerViewLists = (RecyclerView) findViewById(R.id.recycler_view_list);
    mEmptyListTextView = (TextView) findViewById(R.id.emptyListTextView);
    mRelativeLayout = (RelativeLayout) findViewById(R.id.activity_lists);
    mListList = new ArrayList<>();
    mOpenDeleteDialogListClickListener = this;
    mRemoveListClickListener = this;
}

// Is the adapter empty?
private void checkAdapterIsEmpty() {
    if (mAdapter.getItemCount() == 0) {
        mEmptyListTextView.setVisibility(View.VISIBLE);
    } else {
        mEmptyListTextView.setVisibility(View.GONE);
    }
}

// Setup RecyclerView...
protected void RecyclerViewSetup() {
    mAdapter = new ListsAdapter(mOpenDeleteDialogListClickListener, mListList);
    mAdapter.registerAdapterDataObserver(new RecyclerView.AdapterDataObserver() {
        @Override
        public void onChanged() {
            super.onChanged();
            checkAdapterIsEmpty();
        }

        @Override
        public void onItemRangeChanged(int positionStart, int itemCount) {
            super.onItemRangeChanged(positionStart, itemCount);
        }

        @Override
        public void onItemRangeInserted(int positionStart, int itemCount) {
            super.onItemRangeInserted(positionStart, itemCount);
        }

        @Override
        public void onItemRangeRemoved(int positionStart, int itemCount) {
            super.onItemRangeRemoved(positionStart, itemCount);
        }

        @Override
        public void onItemRangeMoved(int fromPosition, int toPosition, int itemCount) {
            super.onItemRangeMoved(fromPosition, toPosition, itemCount);
        }
    });

    RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(this);
    mRecyclerViewLists.setLayoutManager(layoutManager);
    mRecyclerViewLists.setHasFixedSize(true);
    mRecyclerViewLists.setAdapter(mAdapter);
    checkAdapterIsEmpty();
}

// Initializing interfaces...
@Override
public void createListClickListener(View v, String string) {
    mListItem = new ListItem();
    mListItem.setListName(string);
    mListList.add(mListItem);
    mRecyclerViewLists.scrollToPosition(mListList.size() - 1);
    mAdapter.notifyDataSetChanged();
    // saveList();
    Toast.makeText(ListsActivity.this, "\"" + mListItem.getListName() + "\"" + " has been created.", Toast.LENGTH_SHORT).show();
}

private void saveList() {
    EasyListDataSource easyListDataSource = new EasyListDataSource(this);
    // easyListDataSource.create(mListItem);
}

NewItemDialogFragment:

public interface CreateListClickListener {
    void createListClickListener(View v, String string);
}

public void setCreateListClickListener(CreateListClickListener createListClickListener) {
    mCreateListClickListener = createListClickListener;
}

public NewListDialogFragment() {}

private EditText mListEditText;
private TextView mAcceptListTextView;
private LinearLayout mLinearLayout;
private CreateListClickListener mCreateListClickListener;

@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
    final Context context = getActivity();

    // Creating the builder...
    AlertDialog.Builder builder = new AlertDialog.Builder(context);
    View dialogView = getActivity().getLayoutInflater().inflate(R.layout.create_list_dialog, null);
    builder.setView(dialogView);

    // Initialize variables...
    mListEditText = (EditText) dialogView.findViewById(R.id.listEditText);
    mAcceptListTextView = (TextView) dialogView.findViewById(R.id.acceptListTextView);
    mLinearLayout = (LinearLayout) dialogView.findViewById(R.id.NewListLayout);

    // Creating the dialog...
    final AlertDialog dialog = builder.create();

    // OnClickListeners...
    mAcceptListTextView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            String item = mListEditText.getText().toString();
            if (item.equals("") || item.startsWith(" ")) {
                String message = "Please fill in the empty field.";
                Toast.makeText(context, message, Toast.LENGTH_SHORT).show();
            } else {
                // mCreateListClickListener.createListClickListener(view, item);
                dialog.dismiss();
            }
        }
    });

    return dialog;
}

在您的create方法中,您需要結束事務以取消阻止數據庫:

 public void create(ListItem item) { // SQLiteDatabase database = open(); database.beginTransaction(); ContentValues contentValues = new ContentValues(); contentValues.put(EasyListSQLiteHelper.LISTS_NAME, item.getListName()); contentValues.put(EasyListSQLiteHelper.LISTS_CHECKED, item.getImportant()); database.insert(EasyListSQLiteHelper.LISTS_TABLE, null, contentValues); database.setTransactionSuccessful(); database.endTransaction(); database.close(); close(database); } 

暫無
暫無

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

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