Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在android中尝试访问SQLite数据库时,如何修复SQLiteOpenHelper.getDatabaseLocked错误?_Android_Sqlite - Fatal编程技术网

在android中尝试访问SQLite数据库时,如何修复SQLiteOpenHelper.getDatabaseLocked错误?

在android中尝试访问SQLite数据库时,如何修复SQLiteOpenHelper.getDatabaseLocked错误?,android,sqlite,Android,Sqlite,我正在尝试从Sqlite数据库检索一些数据。但是,当我尝试使用getTaskSent方法检索数据时,会出现以下错误。有人能为我提供以下错误的解决方案吗 E/AndroidRuntime(23159): at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:224) 这是我的数据库代码: public class Databasehandler extends SQLiteOp

我正在尝试从Sqlite数据库检索一些数据。但是,当我尝试使用getTaskSent方法检索数据时,会出现以下错误。有人能为我提供以下错误的解决方案吗

  E/AndroidRuntime(23159):  at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:224)
这是我的数据库代码:

public class Databasehandler extends SQLiteOpenHelper{
private static final String LOGCAT = null;

public Databasehandler(Context applicationcontext) {
    super(applicationcontext,"androidsqlite.db", null, 4);
    // TODO Auto-generated constructor stub
    Log.d(LOGCAT,"Database Created");

}
@Override
public void onCreate(SQLiteDatabase db) {
    // TODO Auto-generated method stub
    String query,query1,query2; 
    query = "CREATE TABLE userlogin ( phoneId INTEGER PRIMARY KEY,username TEXT,userid INTEGER,contacts TEXT UNIQUE)";
 query1 = "CREATE TABLE task ( TaskId INTEGER PRIMARY KEY,heading TEXT,desc TEXT,d1 TEXT,d2 TEXT,t1 TEXT,t2 TEXT,receiver TEXT,sender TEXT)";
 query2 = "CREATE TABLE me ( fbId INTEGER PRIMARY KEY,fbname TEXT,fbuserid INTEGER,fbpic BLOB,ph TEXT,email TEXT)"; 
 db.execSQL(query1);
    db.execSQL(query);
    db.execSQL(query2);

}
 public void inserttask(HashMap<String, String> queryValues) {
    SQLiteDatabase database = this.getWritableDatabase();
    ContentValues values2 = new ContentValues();
    values2.put("heading", queryValues.get("heading"));
    values2.put("desc", queryValues.get("desc"));
    values2.put("d1", queryValues.get("d1"));
    values2.put("d2", queryValues.get("d2"));
    values2.put("t1", queryValues.get("t1"));
    values2.put("t2", queryValues.get("t2"));
    values2.put("sender", queryValues.get("sender"));
    values2.put("receiver", queryValues.get("receiver"));

    database.insert("task", null, values2);
    database.close();
}
  public ArrayList<HashMap<String, String>> getTaskSent() {
    ArrayList<HashMap<String, String>> wordList;
    wordList = new ArrayList<HashMap<String, String>>();
    String selectQuery = "SELECT * FROM task";

    SQLiteDatabase database = this.getReadableDatabase();
    Cursor cursor = database.rawQuery(selectQuery, null);
    if (cursor.moveToFirst()) {
        do {
            HashMap<String, String> map = new HashMap<String, String>();
            //map.put("userid", cursor.getString(1));
            map.put("heading", cursor.getString(1));
            map.put("desc", cursor.getString(2));
            map.put("d1", cursor.getString(3));
            map.put("d2", cursor.getString(4));
            map.put("t1", cursor.getString(5));
            map.put("t2", cursor.getString(6)); 
            map.put("receiver", cursor.getString(7));                                                                                                           

            wordList.add(map);
        } while (cursor.moveToNext());
    }cursor.close();
    database.close();


    return wordList;
}
公共类Databasehandler扩展了SQLiteOpenHelper{
私有静态最终字符串LOGCAT=null;
公共数据库处理程序(上下文应用程序上下文){
super(applicationcontext,“androidsqlite.db”,null,4);
//TODO自动生成的构造函数存根
Log.d(LOGCAT,“创建的数据库”);
}
@凌驾
public void onCreate(SQLiteDatabase db){
//TODO自动生成的方法存根
字符串查询,查询1,查询2;
query=“创建表userlogin(phoneId整数主键、用户名文本、userid整数、联系人文本唯一)”;
query1=“创建表任务(任务ID整数主键、标题文本、说明文本、d1文本、d2文本、t1文本、t2文本、接收方文本、发送方文本)”;
query2=“创建表me(fbId整数主键、fbname文本、fbuserid整数、fbpic BLOB、ph文本、电子邮件文本)”;
db.execSQL(查询1);
execSQL(查询);
db.execSQL(查询2);
}
公共void inserttask(HashMap查询值){
SQLiteDatabase=this.getWritableDatabase();
ContentValues2=新的ContentValues();
values2.put(“标题”),queryValues.get(“标题”);
values2.put(“desc”),queryValues.get(“desc”);
values2.put(“d1”,queryValues.get(“d1”);
values2.put(“d2”,queryValues.get(“d2”);
values2.put(“t1”,queryValues.get(“t1”);
values2.put(“t2”),queryValues.get(“t2”);
values2.put(“发送方”,queryValues.get(“发送方”);
values2.put(“接收方”),queryValues.get(“接收方”);
数据库。插入(“任务”,空,值2);
close()数据库;
}
公共ArrayList getTaskSent(){
ArrayList词表;
wordList=newarraylist();
String selectQuery=“选择*来自任务”;
SQLiteDatabase=this.getReadableDatabase();
Cursor=database.rawQuery(selectQuery,null);
if(cursor.moveToFirst()){
做{
HashMap=newHashMap();
//put(“userid”,cursor.getString(1));
map.put(“heading”,cursor.getString(1));
map.put(“desc”,cursor.getString(2));
map.put(“d1”,cursor.getString(3));
map.put(“d2”,cursor.getString(4));
map.put(“t1”,cursor.getString(5));
map.put(“t2”,cursor.getString(6));
map.put(“receiver”,cursor.getString(7));
添加(地图);
}while(cursor.moveToNext());
}cursor.close();
close()数据库;
返回词表;
}

传递给
数据库处理程序的
上下文
构造函数为
null
您的代码看起来不错,不应导致异常

事实上,当一个活动(或任务)试图访问数据库进行写入,而该数据库已经在其他地方(其他活动、类等)打开进行写入时,就会发生异常

我建议您实施此处描述的解决方案:

它基于两件事: 调用getReadableDatabase时,SQLite并不总是返回可读数据库,但可能返回可写数据库,并在任何地方使用一个SQLiteOpenHelper单实例(singleton)和一个OpenHelper单实例

该解决方案看起来有些过分,但在使用SQLite时,它是一种最佳实践:您的应用程序具有更高的可伸缩性(查询速度更快)和线程安全性(防止查询冲突)

我希望这能有所帮助,我很乐意回答任何问题:)

最后添加到清单文件中

<application
    android:name="<Your Package Name>.RetriveMyApplicationContext"
    ........


       > 
   <activity .....


若要获得解决此问题的帮助,请在初始化databasehandler的位置发布代码。此外,通常您应该发布完整的异常stacktrace,而不仅仅是其中的一行,尽管在这种情况下很容易理解,因为此问题每周在这里被问多次。这并不能提供问题的答案。要评论或请求clari如果您是作者,请在他们的帖子下方留下评论。@Migol:这与问题中提供的详细程度有关。请在VLQ评论中小心,谢谢:)嗨,您能解释一下什么时候调用getSentTask方法吗?它是在'inserttask'之后调用的吗?在AsyncTask中?我有大约3个活动。我已经创建了一个t的实例每个活动中都有databasehandler。在我的addtask活动中,我有一个listview和一个按钮。在listview中,我希望使用GetTask方法从数据库中获取数据。该按钮转到另一个活动,在该活动中,我使用inserttask将数据插入数据库。这没有帮助。你能为这个错误建议一些其他解决方案吗?嗨,当然!我将继续如果你不介意的话,我还需要一些ifnormalation:)。我需要了解整个过程:如果我的理解很好,你运行应用程序,它会显示一个带有按钮的任务列表。然后你选择一个(或多个?)任务并点击按钮。然后您会看到一个屏幕,其中包含一个调用inserttask的新活动。接下来会发生什么?我还需要知道异常是在您第一次使用add按钮时发生的,还是在成功使用之后发生的?完整的堆栈跟踪还可以帮助我查看更多。嘿..我找到了错误的解决方案。实际上我正在传递数据库构造函数的空上下文。@laalto您必须是genius:D。
DatabaseHandler d = new DatabaseHandler(RetriveMyApplicationContext.getAppContext());
<application
    android:name="<Your Package Name>.RetriveMyApplicationContext"
    ........


       > 
   <activity .....