2014-02-24 104 views
0

我想从Sqlite数据库检索一些数据。但是,当我尝试使用方法getTaskSent检索数据时,出现以下错误。任何人都可以建议我解决以下错误?如何在尝试访问android中的SQLite数据库时修复SQLiteOpenHelper.getDatabaseLocked错误?

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; 
} 
+0

你好,当你调用getSentTask方法你能解​​释一下吗?它是否在'inserttask'之后被调用?在AsyncTask中? – KLiFF

+0

我有3个活动。我已经在每个活动中创建了数据库处理程序的一个实例。在我的addtask活动中,我有一个listview和一个按钮。在listview中,我想使用getTaskSent方法从数据库获取数据。按钮转到另一个使用inserttask将数据插入数据库的活动。 – user3256145

回答

1

Context传递给你的Databasehandler构造函数是null

+0

要获得有关修复的帮助,请在初始化数据库处理程序的位置发布代码。此外,通常您应该发布完整的异常堆栈跟踪,而不仅仅是一行,但在这种情况下,很容易找出问题,因为每周都会多次询问此问题。 – laalto

+0

这不提供问题的答案。要批评或要求作者澄清,请在其帖子下方留言。 – Migol

+0

@Molol:它符合问题中可用的详细程度。请小心VLQ评论,谢谢:) – laalto

0

你的代码看起来不错,不应该引起异常。

异常occures其实当一个活动(或任务)尝试访问数据库的写入,而已经打开写在其他地方(的其他活动,类...等)。

我建议你实现在此描述的解决方案:https://github.com/dmytrodanylyk/dmytrodanylyk/blob/gh-pages/articles/Concurrent%20Database%20Access.md

它是基于两点: SQLite不总是返回读取数据库,当你调用getReadableDatabase但可能会返回一个可写的数据库,以及无处不在(单)使用一个SQLiteOpenHelper单一实例,然后从打开SQLiteDatabase的一个单一实例帮手单身人士。

的解决方案可能看起来矫枉过正,但它使用SQLite时是最佳的做法:你的应用程序变得更可伸缩(查询速度快)和线程安全(防止查询碰撞)。

我希望这可以帮助,我仍然availabel任何问题:)。

+0

它没有帮助。你能否为这个错误建议一些其他解决方案? – user3256145

+0

嗨,当然!如果你不介意的话,我会需要更多的信息:)。我需要了解整个过程:如果我的理解力很好,那么运行该应用程序,并使用按钮显示任务列表。然后你选择一个(或更多?)任务并按下按钮。然后你看到一个新的活动调用inserttask。接下来发生什么?我还需要知道在第一次使用添加按钮或成功使用后出现异常吗?完整的堆栈跟踪也可以帮助我看到更多。 – KLiFF

+0

嘿..我得到了错误的解决方案。其实我正在向数据库构造函数传递一个空的上下文。 – user3256145

0
public class RetriveMyApplicationContext extends Application { 

    /*Don't forget to mention RetriveMyApplicationContext Class in Manifests File otherwise it will throw NullPointer Exception 
    <application 
    android:name=".volley.RetriveMyApplicationContext"*/ 


    private static RetriveMyApplicationContext mRetriveMyApplicationContext; 

     @Override 
     public void onCreate() { 
     super.onCreate(); 
     mRetriveMyApplicationContext = this; 
} 

     public static RetriveMyApplicationContext getInstance() { 

     return mRetriveMyApplicationContext; 
    } 

     public static Context getAppContext() { 

     return mRetriveMyApplicationContext.getApplicationContext(); 
} 
} 

首先创建上面的类和使用上面的类要通过上下文 如;

DatabaseHandler d = new DatabaseHandler(RetriveMyApplicationContext.getAppContext()); 

最后添加到清单文件

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


     > 
    <activity ..... 
相关问题