java - this.getReadableDatabase() 处出现 NullPointerException;

标签 java android database sqlite nullpointerexception

嘿嘿:)

我查看了同一主题的几个问题,但没有找到解决我的问题的方法。

this.getReadableDatabase(); 处出现 NullPointerException...

这是我的代码:

public class DatabaseHandler extends SQLiteOpenHelper {

public static final int DATABASE_VERSION = 1;

public static final String DATABASE_NAME = "TODO_APP";

/*--------------------------- TABLE ITEMS START ---------------------------*/
private static final String TABLE_ITEMS = "items";
private static String KEY_ID_ITEMS = "id_items";
private static final String KEY_CATEGORY_ITEMS = "category";
private static final String KEY_DATETIME_ITEMS = "datetime";
private static String KEY_NAME_ITEMS = "name";
private static final String KEY_DESCRIPTION_ITEMS = "description";
private static final String KEY_ALARM_ITEMS = "alarm";

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

@Override
public void onCreate(SQLiteDatabase db) {

    // create table ITEMS
    String CREATE_ITEMS_TABLE = "CREATE TABLE " + TABLE_ITEMS + "("
            + KEY_ID_ITEMS + " INTEGER PRIMARY KEY," + KEY_CATEGORY_ITEMS
            + " INTEGER," + KEY_DATETIME_ITEMS
            + " TIMESTAMP DEFAULT CURRENT_TIMESTAMP," + KEY_NAME_ITEMS
            + " TEXT," + KEY_DESCRIPTION_ITEMS + " TEXT," + KEY_ALARM_ITEMS
            + " INTEGER" + ");";
    db.execSQL(CREATE_ITEMS_TABLE);
}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    // Drop older table if existed
    db.execSQL("DROP TABLE IF EXISTS " + TABLE_ITEMS);

    // Create tables again
    this.onCreate(db);
}

public void addItem(DB_Item item) {
    SQLiteDatabase db = this.getWritableDatabase();

    ContentValues values = new ContentValues();
    values.put(KEY_CATEGORY_ITEMS, item.getCategory());
    values.put(KEY_NAME_ITEMS, item.getName());
    values.put(KEY_DESCRIPTION_ITEMS, item.getDescription());
    values.put(KEY_ALARM_ITEMS, item.getAlarm());

    // Inserting Row
    db.insert(TABLE_ITEMS, null, values);
    db.close(); // Closing database connection
}

public DB_Item getItem(String name) {

//!!!!! Here is one problem !!!!!
    SQLiteDatabase db = this.getReadableDatabase();

    Cursor cursor = db.query(TABLE_ITEMS, new String[] { KEY_ID_ITEMS,
            KEY_CATEGORY_ITEMS, KEY_DATETIME_ITEMS, KEY_NAME_ITEMS,
            KEY_DESCRIPTION_ITEMS, KEY_ALARM_ITEMS },
            KEY_NAME_ITEMS = " = ?", new String[] { String.valueOf(name) },
            null, null, null, null);
    if (cursor != null) {
        cursor.moveToFirst();
    }

    // DB_Item (int category, String name, String description, int
    // alarm)
    DB_Item item = new DB_Item(cursor.getInt(1), cursor.getString(3),
            cursor.getString(4), cursor.getInt(5));

    return item;
}

public List<DB_Item> getAllItems() {
    List<DB_Item> itemList = new ArrayList<DB_Item>();

    // SELECT ALL
    String selectQuery = "SELECT * FROM " + TABLE_ITEMS;

//!!!!!!!!!! here is the other Problem
    SQLiteDatabase database = this.getWritableDatabase();

    Cursor cursor = database.rawQuery(selectQuery, null);

    // go through all rows and then adding to list
    if (cursor.moveToFirst()) {
        do {
            DB_Item item = new DB_Item();
            item.setCategory(Integer.parseInt(cursor.getString(0)));
            // TODO

            // adding to list
            itemList.add(item);
        } while (cursor.moveToNext());
    }
    return itemList;
}

[等等,没有复制整个代码]

希望你能帮助我... 该错误肯定出现在 SQLiteDatabase db = this.getReadableDatabase();

输出:

09-03 08:34:17.863: E/AndroidRuntime(7074): java.lang.RuntimeException: Unable to start activity ComponentInfo{todo.todo_list/todo.view.StartApp}: java.lang.NullPointerException
09-03 08:34:17.863: E/AndroidRuntime(7074):     at todo.database.DatabaseHandler.getAllItems(DatabaseHandler.java:144)
09-03 08:34:17.863: E/AndroidRuntime(7074):     at todo.helper.SortItems.sortItemsCategory(SortItems.java:16)
09-03 08:34:17.863: E/AndroidRuntime(7074):     at todo.view.StartApp.onCreate(StartApp.java:36)

最佳答案

将你的类更改为这样的内容:

package com.mhp.example;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;

public class DBAdapter {
/*--------------------------- TABLE ITEMS START ---------------------------*/
private static final String TABLE_ITEMS = "items";
private static String KEY_ID_ITEMS = "id_items";
private static final String KEY_CATEGORY_ITEMS = "category";
private static final String KEY_DATETIME_ITEMS = "datetime";
private static String KEY_NAME_ITEMS = "name";
private static final String KEY_DESCRIPTION_ITEMS = "description";
private static final String KEY_ALARM_ITEMS = "alarm";


private static final String TAG = "DBAdapter";

private static final String DATABASE_NAME = "dbname";
private static final int DATABASE_VERSION = 1;

tring CREATE_ITEMS_TABLE = "CREATE TABLE " + TABLE_ITEMS + "("
        + KEY_ID_ITEMS + " INTEGER PRIMARY KEY," + KEY_CATEGORY_ITEMS
        + " INTEGER," + KEY_DATETIME_ITEMS
        + " TIMESTAMP DEFAULT CURRENT_TIMESTAMP," + KEY_NAME_ITEMS
        + " TEXT," + KEY_DESCRIPTION_ITEMS + " TEXT," + KEY_ALARM_ITEMS
        + " INTEGER" + ");";





private final Context context;    

private DatabaseHelper DBHelper;
private SQLiteDatabase db;

public DBAdapter(Context ctx) 
{
    this.context = ctx;
    DBHelper = new DatabaseHelper(context);
}

private static class DatabaseHelper extends SQLiteOpenHelper 
{
    DatabaseHelper(Context context) 
    {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase db) 
    {
        try {
            db.execSQL(CREATE_ITEMS_TABLE); 
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) 
    {
        Log.w(TAG, "Upgrading database from version " + oldVersion + " to "
                + newVersion + ", which will destroy all old data");
        db.execSQL("DROP TABLE IF EXISTS contacts");

        onCreate(db);
    }
}    

//---opens the database---
public DBAdapter open() throws SQLException 
{
    db = DBHelper.getWritableDatabase();
    return this;
}

//---closes the database---    
public void close() 
{
    DBHelper.close();
}


public void addItem(DB_Item item) {

ContentValues values = new ContentValues();
values.put(KEY_CATEGORY_ITEMS, item.getCategory());
values.put(KEY_NAME_ITEMS, item.getName());
values.put(KEY_DESCRIPTION_ITEMS, item.getDescription());
values.put(KEY_ALARM_ITEMS, item.getAlarm());

// Inserting Row
db.insert(TABLE_ITEMS, null, values);
}

public DB_Item getItem(String name) {


Cursor cursor = db.query(TABLE_ITEMS, new String[] { KEY_ID_ITEMS,
        KEY_CATEGORY_ITEMS, KEY_DATETIME_ITEMS, KEY_NAME_ITEMS,
        KEY_DESCRIPTION_ITEMS, KEY_ALARM_ITEMS },
        KEY_NAME_ITEMS = " = ?", new String[] { String.valueOf(name) },
        null, null, null, null);
if (cursor != null) {
    cursor.moveToFirst();
}

// DB_Item (int category, String name, String description, int
// alarm)
DB_Item item = new DB_Item(cursor.getInt(1), cursor.getString(3),
        cursor.getString(4), cursor.getInt(5));

return item;
}

public List<DB_Item> getAllItems() {
List<DB_Item> itemList = new ArrayList<DB_Item>();

// SELECT ALL
String selectQuery = "SELECT * FROM " + TABLE_ITEMS;


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

// go through all rows and then adding to list
if (cursor.moveToFirst()) {
    do {
        DB_Item item = new DB_Item();
        item.setCategory(Integer.parseInt(cursor.getString(0)));
        // TODO

        // adding to list
        itemList.add(item);
    } while (cursor.moveToNext());
}
return itemList;
}
}  

注意:当您从 DBAdapter 创建对象时,您应该 open() 数据库,并在工作完成后 close() 它。

DBAdapter db = new DBAdapter(contex);
db.open();
//do you work
db.close();

关于java - this.getReadableDatabase() 处出现 NullPointerException;,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25639260/

相关文章:

php - 使用PHP将PDF另存为blob吗?

java - 为什么 resolve dependencies 'classpath' 这么慢?

java - 将 3D 世界(arcore anchor/pose)转换为其对应的 2D 屏幕坐标

java - 如何在 Android 中的 Fragment 上使用 OnClickListener

android - 如何在android中存储多个复选框值?

android - shell 无法使用 > 和 >> 捕获文件中的输出

java - Android 生命周期问题

mysql - 根据另一个表的条件插入 sql 语句

ruby-on-rails - ruby (续集): filtering by date (year) and attribute

java - Android中SOAP的HTTP GET方法,请纠正我