NullPointerException异常上getReadableDatabase() [英] NullPointerException on getReadableDatabase()

查看:314
本文介绍了NullPointerException异常上getReadableDatabase()的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个类(非活动)此方法 -

 公共布尔usernameChk(字符串usrname){    字符串usrnmQuery =SELECT * FROM+ TABLE_ACCOUNTS +其中username ='+ usrname +';
    SQLiteDatabase分贝= this.getReadableDatabase();
    //线以上的NullPointerException    光标光标= db.rawQuery(usrnmQuery,NULL);
    cursor.close();    如果(cursor.getCount()&下; = 0){
        返回false;
    }其他{
        返回true;
    }}

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

 私人上下文的背景下;
this.context =背景;
新的数据库处理器(本);数据库处理器龙珠Z =新的数据库处理器(背景);
布尔Z = dbz.usernameChk(username.getText()的toString());

下面是我的LogCat中 -

 一十月9日至2日:28:11.906:W / ApplicationPackageManager(9380):getCSCPackageItemText()
10月9日至2日:28:12.171:D / OpenGLRenderer(9380):启用调试模式0
10月9日至2日:28:13.881:W / ApplicationPackageManager(9380):getCSCPackageItemText()
10月9日至2日:28:18.436:D / AndroidRuntime(9380):关闭VM
10月9日至2日:28:18.436:W / dalvikvm(9380):主题ID = 1:螺纹未捕获的异常退出(组= 0x4180ec08)
10月9日至2日:28:18.441:E / AndroidRuntime(9380):致命异常:主要
10月9日至2日:28:18.441:E / AndroidRuntime(9380):工艺:com.Atlantiz.diary,PID:9380
10月9日至2日:28:18.441:E / AndroidRuntime(9380):显示java.lang.NullPointerException
10月9日至2日:28:18.441:E / AndroidRuntime(9380):在android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:224)
10月9日至2日:28:18.441:E / AndroidRuntime(9380):在android.database.sqlite.SQLiteOpenHelper.getReadableDatabase(SQLiteOpenHelper.java:188)
10月9日至2日:28:18.441:E / AndroidRuntime(9380):在com.Atlantiz.diary.DatabaseHandler.usernameChk(DatabaseHandler.java:142)
10月9日至2日:28:18.441:E / AndroidRuntime(9380):在com.Atlantiz.diary.Create.onClick(Create.java:42)
10月9日至2日:28:18.441:E / AndroidRuntime(9380):在android.view.View.performClick(View.java:4633)
10月9日至2日:28:18.441:E / AndroidRuntime(9380):在android.view.View $ PerformClick.run(View.java:19330)
10月9日至2日:28:18.441:E / AndroidRuntime(9380):在android.os.Handler.handleCallback(Handler.java:733)
10月9日至2日:28:18.441:E / AndroidRuntime(9380):在android.os.Handler.dispatchMessage(Handler.java:95)
10月9日至2日:28:18.441:E / AndroidRuntime(9380):在android.os.Looper.loop(Looper.java:157)
10月9日至2日:28:18.441:E / AndroidRuntime(9380):在android.app.ActivityThread.main(ActivityThread.java:5356)
10月9日至2日:28:18.441:E / AndroidRuntime(9380):在java.lang.reflect.Method.invokeNative(本机方法)
10月9日至2日:28:18.441:E / AndroidRuntime(9380):在java.lang.reflect.Method.invoke(Method.java:515)
10月9日至2日:28:18.441:E / AndroidRuntime(9380):在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:1265)
10月9日至2日:28:18.441:E / AndroidRuntime(9380):在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1081)
10月9日至2日:28:18.441:E / AndroidRuntime(9380):在dalvik.system.NativeStart.main(本机方法)

我知道这种类型的问题被问过,但给出的解决方案,没有工作。关于如何解决它的任何想法?

修改

构造函数 -

 公共数据库处理器(上下文的背景下){
       超(背景下,DATABASE_NAME,空,DATABASE_VERSION);
   }

和类 -

 包com.Atlantiz.diary;进口的java.util.ArrayList;
进口的java.util.List;
进口android.content.ContentValues​​;
进口android.content.Context;
进口android.database.Cursor;
进口android.database.sqlite.SQLiteDatabase;
进口android.database.sqlite.SQLiteOpenHelper;公共类数据库处理器扩展SQLiteOpenHelper {//所有静态变量
//数据库版本
私有静态最终诠释DATABASE_VERSION = 1;//数据库名称
私有静态最后弦乐DATABASE_NAME =的AccountManager;//联系人表名
私有静态最后弦乐TABLE_ACCOUNTS =账户;//联系方式表列名
私有静态最后弦乐KEY_ID =ID;
私有静态最后弦乐KEY_F_NAME =FIRST_NAME;
私有静态最后弦乐KEY_L_NAME =姓氏;
私有静态最后弦乐KEY_USERNAME =用户名;
私有静态最后弦乐KEY_EMAIL =电子邮件;
私有静态最后弦乐KEY_PASSWORD =密码;公共数据库处理器(上下文的背景下){
       超(背景下,DATABASE_NAME,空,DATABASE_VERSION);
   }@覆盖
公共无效的onCreate(SQLiteDatabase DB){
    // TODO自动生成方法存根    字符串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);}@覆盖
公共无效onUpgrade(SQLiteDatabase分贝,INT oldVersion,诠释静态网页){    db.execSQL(DROP TABLE IF EXISTS+ TABLE_ACCOUNTS);    的onCreate(DB);}//添加新联系人
公共无效的addContact(帐户帐户){    SQLiteDatabase分贝= this.getWritableDatabase();    ContentValues​​值=新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,空,价值);
    db.close();}//获取单触点
公共账目getContact(INT ID){    SQLiteDatabase分贝= this.getReadableDatabase();    光标光标= db.query(TABLE_ACCOUNTS,新的String [] {KEY_ID,
            KEY_F_NAME,KEY_L_NAME,KEY_USERNAME,KEY_EMAIL,KEY_PASSWORD},KEY_ID +=?,
            新的String [] {将String.valueOf(ID)},NULL,NULL,NULL,NULL);
    如果(指针!= NULL)
        cursor.moveToFirst();    帐户帐户=新帐户(的Integer.parseInt(cursor.getString(0)),
            cursor.getString(1),cursor.getString(2),cursor.getString(3),cursor.getString(4),cursor.getString(5));
    //返回接触
    返回账户;}//获取所有联系人
公开名单<帐户> getAllAccounts(){    清单<帐户>为accountList =新的ArrayList<帐户>();
    //选择所有查询
    字符串selectQuery =SELECT * FROM+ TABLE_ACCOUNTS;    SQLiteDatabase分贝= this.getWritableDatabase();
    光标光标= db.rawQuery(selectQuery,NULL);    //通过所有行循环,并增加列表
    如果(cursor.moveToFirst()){
        做{
            帐户帐户=新帐户();
            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));
            //添加联系人名单
            AccountList.add(账户);
        }而(cursor.moveToNext());
    }    //返回联系人列表
    返回为accountList;}//获取联系人计数
公众诠释getContactsCount(){    字符串countQuery =SELECT * FROM+ TABLE_ACCOUNTS;
    SQLiteDatabase分贝= this.getReadableDatabase();
    光标光标= db.rawQuery(countQuery,NULL);
    cursor.close();    //返回计数
    返回cursor.getCount();}公共布尔usernameChk(字符串usrname,上下文的背景下){    字符串usrnmQuery =SELECT * FROM+ TABLE_ACCOUNTS +其中username ='+ usrname +';
    SQLiteDatabase分贝= this.getReadableDatabase();    光标光标= db.rawQuery(usrnmQuery,NULL);
    cursor.close();    如果(cursor.getCount()&下; = 0){
        返回false;
    }其他{
        返回true;
    }}//更新单触点
公众诠释updateContact(帐户帐户){    SQLiteDatabase分贝= this.getWritableDatabase();    ContentValues​​值=新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());    //更新行
    返回db.update(TABLE_ACCOUNTS,价值观,KEY_ID +=?,
            新的String [] {将String.valueOf(account.getID())});}//删除单个联系人
公共无效deleteContact(帐户帐户){     SQLiteDatabase分贝= this.getWritableDatabase();
        db.delete(TABLE_ACCOUNTS,KEY_ID +=?,
                新的String [] {将String.valueOf(account.getID())});
        db.close();}}


解决方案

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

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

 数据库处理器龙珠Z =新的数据库处理器(Activity.this);公共上下文的背景下;公共数据库处理器(上下文的背景下){
    超(背景下,DATABASE_NAME,空,DATABASE_VERSION);
    //分配方面改变你的构造
    this.context =背景;
}//打开数据库使用上下文对象
SQLiteDatabase分贝= this.getReadableDatabase();

I have this method in a class (non-activity) -

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

}

But I get NullPointerException on line SQLiteDatabase db = this.getReadableDatabase(); when I call this method from other activity -

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

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

Here is my 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)

I know this type of question was asked before but the solutions given didn't work. Any ideas on how to fix it?

EDIT

Constructor -

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

And class -

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();

}

}

解决方案

As your class which is not an Activity this.getReadableDatabase(); is firing NullPointerException as it is not getting context to open database.

Use context to open database. try with following :

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();

这篇关于NullPointerException异常上getReadableDatabase()的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆