2014-02-24 120 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 ..... 
相關問題