2014-09-02 121 views
0

我有一个类(非活动)此方法 -的NullPointerException上getReadableDatabase()

public boolean usernameChk(String usrname) { 

    String usrnmQuery = "SELECT * FROM " + TABLE_ACCOUNTS + " WHERE username = '" + usrname + "'"; 
    SQLiteDatabase db = this.getReadableDatabase(); 
    //NullPointerException on line above 

    Cursor cursor = db.rawQuery(usrnmQuery, null); 
    cursor.close(); 

    if (cursor.getCount() <= 0) { 
     return false; 
    } else { 
     return true; 
    } 

} 

,但我得到的NullPointerException上线SQLiteDatabase db = this.getReadableDatabase();当我打电话从其他活动这个方法 -

private Context context; 
this.context = context; 
new DatabaseHandler(this); 

DatabaseHandler dbz = new DatabaseHandler(context); 
boolean z = dbz.usernameChk(username.getText().toString()); 

这里是我的logcat -

09-02 10:28:11.906: W/ApplicationPackageManager(9380): getCSCPackageItemText() 
09-02 10:28:12.171: D/OpenGLRenderer(9380): Enabling debug mode 0 
09-02 10:28:13.881: W/ApplicationPackageManager(9380): getCSCPackageItemText() 
09-02 10:28:18.436: D/AndroidRuntime(9380): Shutting down VM 
09-02 10:28:18.436: W/dalvikvm(9380): threadid=1: thread exiting with uncaught exception (group=0x4180ec08) 
09-02 10:28:18.441: E/AndroidRuntime(9380): FATAL EXCEPTION: main 
09-02 10:28:18.441: E/AndroidRuntime(9380): Process: com.Atlantiz.diary, PID: 9380 
09-02 10:28:18.441: E/AndroidRuntime(9380): java.lang.NullPointerException 
09-02 10:28:18.441: E/AndroidRuntime(9380):  at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:224) 
09-02 10:28:18.441: E/AndroidRuntime(9380):  at android.database.sqlite.SQLiteOpenHelper.getReadableDatabase(SQLiteOpenHelper.java:188) 
09-02 10:28:18.441: E/AndroidRuntime(9380):  at com.Atlantiz.diary.DatabaseHandler.usernameChk(DatabaseHandler.java:142) 
09-02 10:28:18.441: E/AndroidRuntime(9380):  at com.Atlantiz.diary.Create.onClick(Create.java:42) 
09-02 10:28:18.441: E/AndroidRuntime(9380):  at android.view.View.performClick(View.java:4633) 
09-02 10:28:18.441: E/AndroidRuntime(9380):  at android.view.View$PerformClick.run(View.java:19330) 
09-02 10:28:18.441: E/AndroidRuntime(9380):  at android.os.Handler.handleCallback(Handler.java:733) 
09-02 10:28:18.441: E/AndroidRuntime(9380):  at android.os.Handler.dispatchMessage(Handler.java:95) 
09-02 10:28:18.441: E/AndroidRuntime(9380):  at android.os.Looper.loop(Looper.java:157) 
09-02 10:28:18.441: E/AndroidRuntime(9380):  at android.app.ActivityThread.main(ActivityThread.java:5356) 
09-02 10:28:18.441: E/AndroidRuntime(9380):  at java.lang.reflect.Method.invokeNative(Native Method) 
09-02 10:28:18.441: E/AndroidRuntime(9380):  at java.lang.reflect.Method.invoke(Method.java:515) 
09-02 10:28:18.441: E/AndroidRuntime(9380):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1265) 
09-02 10:28:18.441: E/AndroidRuntime(9380):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1081) 
09-02 10:28:18.441: E/AndroidRuntime(9380):  at dalvik.system.NativeStart.main(Native Method) 

我知道这类问题的BU之前问所提供的解决方案不起作用。任何想法如何解决它?

编辑

构造 -

public DatabaseHandler(Context context) { 
     super(context, DATABASE_NAME, null, DATABASE_VERSION); 
    } 

和类 -

package com.Atlantiz.diary; 

import java.util.ArrayList; 
import java.util.List; 
import android.content.ContentValues; 
import android.content.Context; 
import android.database.Cursor; 
import android.database.sqlite.SQLiteDatabase; 
import android.database.sqlite.SQLiteOpenHelper; 

public class DatabaseHandler extends SQLiteOpenHelper { 

// All Static variables 
// Database Version 
private static final int DATABASE_VERSION = 1; 

// Database Name 
private static final String DATABASE_NAME = "accountManager"; 

// Contacts table name 
private static final String TABLE_ACCOUNTS = "accounts"; 

// Contacts Table Columns names 
private static final String KEY_ID = "id"; 
private static final String KEY_F_NAME = "first_name"; 
private static final String KEY_L_NAME = "last_name"; 
private static final String KEY_USERNAME = "username"; 
private static final String KEY_EMAIL = "email"; 
private static final String KEY_PASSWORD = "password"; 



public DatabaseHandler(Context context) { 
     super(context, DATABASE_NAME, null, DATABASE_VERSION); 
    } 

@Override 
public void onCreate(SQLiteDatabase db) { 
    // TODO Auto-generated method stub 

    String CREATE_CONTACTS_TABLE = "CREATE TABLE " + TABLE_ACCOUNTS + "(" 
      + KEY_ID + " INTEGER PRIMARY KEY," + KEY_F_NAME + " TEXT," + 
      KEY_L_NAME + " TEXT," + KEY_USERNAME + " TEXT," + KEY_EMAIL + 
      " TEXT," + KEY_PASSWORD + " TEXT" + ")"; 
    db.execSQL(CREATE_CONTACTS_TABLE); 

} 

@Override 
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 

    db.execSQL("DROP TABLE IF EXISTS " + TABLE_ACCOUNTS); 

    onCreate(db); 

} 

// Adding new contact 
public void addContact(Accounts account) { 

    SQLiteDatabase db = this.getWritableDatabase(); 

    ContentValues values = new ContentValues(); 

    values.put(KEY_F_NAME, account.getFirst_name()); 
    values.put(KEY_L_NAME, account.getLast_name()); 
    values.put(KEY_USERNAME, account.getUsername()); 
    values.put(KEY_EMAIL, account.getEmail()); 
    values.put(KEY_PASSWORD, account.getPassword()); 

    db.insert(TABLE_ACCOUNTS, null, values); 
    db.close(); 

} 

// Getting single contact 
public Accounts getContact(int id) { 

    SQLiteDatabase db = this.getReadableDatabase(); 

    Cursor cursor = db.query(TABLE_ACCOUNTS, new String[] { KEY_ID, 
      KEY_F_NAME, KEY_L_NAME, KEY_USERNAME, KEY_EMAIL, KEY_PASSWORD }, KEY_ID + "=?", 
      new String[] { String.valueOf(id) }, null, null, null, null); 
    if (cursor != null) 
     cursor.moveToFirst(); 

    Accounts account = new Accounts(Integer.parseInt(cursor.getString(0)), 
      cursor.getString(1), cursor.getString(2), cursor.getString(3), cursor.getString(4), cursor.getString(5)); 
    // return contact 
    return account; 

} 



// Getting All Contacts 
public List<Accounts> getAllAccounts() { 

    List<Accounts> AccountList = new ArrayList<Accounts>(); 
    // Select All Query 
    String selectQuery = "SELECT * FROM " + TABLE_ACCOUNTS; 

    SQLiteDatabase db = this.getWritableDatabase(); 
    Cursor cursor = db.rawQuery(selectQuery, null); 

    // looping through all rows and adding to list 
    if (cursor.moveToFirst()) { 
     do { 
      Accounts account = new Accounts(); 
      account.setID(Integer.parseInt(cursor.getString(0))); 
      account.setFirst_name(cursor.getString(1)); 
      account.setLast_name(cursor.getString(2)); 
      account.setUsername(cursor.getString(3)); 
      account.setEmail(cursor.getString(4)); 
      account.setPassword(cursor.getString(5)); 
      // Adding contact to list 
      AccountList.add(account); 
     } while (cursor.moveToNext()); 
    } 

    // return contact list 
    return AccountList; 

} 

// Getting contacts Count 
public int getContactsCount() { 

    String countQuery = "SELECT * FROM " + TABLE_ACCOUNTS; 
    SQLiteDatabase db = this.getReadableDatabase(); 
    Cursor cursor = db.rawQuery(countQuery, null); 
    cursor.close(); 

    // return count 
    return cursor.getCount(); 

} 

public boolean usernameChk(String usrname, Context context){ 

    String usrnmQuery = "SELECT * FROM " + TABLE_ACCOUNTS + " WHERE username = '" + usrname + "'"; 
    SQLiteDatabase db = this.getReadableDatabase(); 

    Cursor cursor = db.rawQuery(usrnmQuery, null); 
    cursor.close(); 

    if(cursor.getCount() <= 0){ 
     return false; 
    }else{ 
     return true; 
    } 

} 

// Updating single contact 
public int updateContact(Accounts account) { 

    SQLiteDatabase db = this.getWritableDatabase(); 

    ContentValues values = new ContentValues(); 
    values.put(KEY_F_NAME, account.getFirst_name()); 
    values.put(KEY_L_NAME, account.getLast_name()); 
    values.put(KEY_USERNAME, account.getLast_name()); 
    values.put(KEY_EMAIL, account.getLast_name()); 
    values.put(KEY_PASSWORD, account.getLast_name()); 

    // updating row 
    return db.update(TABLE_ACCOUNTS, values, KEY_ID + " = ?", 
      new String[] { String.valueOf(account.getID()) }); 

} 

// Deleting single contact 
public void deleteContact(Accounts account) { 

    SQLiteDatabase db = this.getWritableDatabase(); 
     db.delete(TABLE_ACCOUNTS, KEY_ID + " = ?", 
       new String[] { String.valueOf(account.getID()) }); 
     db.close(); 

} 

} 
+0

你能发布更多的代码? – 2014-09-02 04:58:57

+0

什么是DatabaseHandler类的构造函数? – RusArtM 2014-09-02 04:59:08

+0

发布整个包含'usernameChk()'的方法'方法 – 2014-09-02 05:01:12

回答

6

当你的类,这是不是一个活动this.getReadableDatabase();被烧成空指针异常,因为它没有得到上下文打开数据库。

使用上下文打开数据库。尝试以下操作:

DatabaseHandler dbz = new DatabaseHandler(Activity.this); 

public Context context; 

public DatabaseHandler(Context context) { 
    super(context, DATABASE_NAME, null, DATABASE_VERSION); 
    // assigning context Change your constructor 
    this.context = context; 
} 

// Open database using context object 
SQLiteDatabase db = this.getReadableDatabase(); 
+0

它的价值是什么,它不会被编译。 Context中没有'getReadableDatabase()'。 – laalto 2014-09-02 05:08:49

+0

不工作。仍然得到nullpointerexception。 – Confuse 2014-09-02 05:12:27

+0

@AntiMatter你保留了这条线。 'DatabaseHandler dbz = new DatabaseHandler(Activity。这个);'显示你的活动代码 – SilentKiller 2014-09-02 05:13:31

1

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

这就是NPE getDatabaseLocked()的解释。要获得帮助解决该问题,请在初始化上下文的位置发布代码。

1

你没有通过你的活动的正确的上下文,这就是为什么它抛出空指针错误。

只需更改您的方法如下。

public boolean usernameChk(String usrname){ 

    String usrnmQuery = "SELECT * FROM " + TABLE_ACCOUNTS + " WHERE username = '" + usrname + "'"; 
    SQLiteDatabase db = this.getReadableDatabase(); 

中声明你的DatabaseHelper一个共同Context,并在你的同时创造助手类如下面的实例分配构造函数的值:

public Context m_context; 
public DatabaseHandler(Context context) { 
    super(context, DATABASE_NAME, null, DATABASE_VERSION); 
    m_context = context; 
} 
+0

我认为你也应该更新答案,因为它是错误的 – SilentKiller 2014-09-02 05:14:33

+0

什么是错的? – GrIsHu 2014-09-02 05:16:12

+0

'getReadableDatabase();'不是上下文的一种方法。 – SilentKiller 2014-09-02 05:16:48

1

根据你的代码背景没有定义。

使用这个,而不是方面创建助手的一个新实例时

DatabaseHandler dbz = new DatabaseHandler(this); 
boolean z = dbz.usernameChk(username.getText().toString()); 
+0

你有检查代码。 – SilentKiller 2014-09-02 05:07:26

+0

这应该从Activity类调用,所以通过这个将解决null上下文参数的问题.... – RusArtM 2014-09-02 05:12:04

+0

而不是此传递Activity上下文。 – SilentKiller 2014-09-02 05:14:10