java.lang.NullPointerException 在 android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java :224)

标签 java android sql database sqlite

我无法理解我是如何错误地初始化数据库的:

java.lang.NullPointerException
        at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:224)
        at android.database.sqlite.SQLiteOpenHelper.getReadableDatabase(SQLiteOpenHelper.java:188)
        at com.example.stopcall.app.dal.PhoneDal.getItem(PhoneDal.java:105)
        at com.example.stopcall.app.ItemDetailFragment$1.onClick(ItemDetailFragment.java:87)
        at android.view.View.performClick(View.java:4654)
        at android.view.View$PerformClick.run(View.java:19438)
        at android.os.Handler.handleCallback(Handler.java:733)

代码落在这一行:SQLiteDatabase db = this.getWritableDatabase();

来自这段代码:

public class PhoneDal extends SQLiteOpenHelper {

    // Database Version
    private static final int DATABASE_VERSION = 1;
    // Database Name
    private static final String DATABASE_NAME = Constants.DB_NAME;

    private static final String BLOCKED_PHONES_TABLE = "BLOCKED_PHONES_TABLE";
    private static final String COMMENTS_TABLE = "COMMENTS_TABLE";

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

    @Override
    public void onCreate(SQLiteDatabase db) {
        // SQL statement to create book table

        String CREATE_BLOCKED_PHONES_TABLE = "CREATE TABLE "
                + BLOCKED_PHONES_TABLE + " ( "
                + "id INTEGER PRIMARY KEY AUTOINCREMENT, " + "phone TEXT, "
                + "isBlocked BIT )";

        db.execSQL(CREATE_BLOCKED_PHONES_TABLE);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        if (newVersion > oldVersion) {
            Log.w("MyAppTag", "Updating database from version " + oldVersion
                    + " to " + newVersion + " .Existing data will be lost.");
            // Drop older books table if existed
            db.execSQL("DROP TABLE IF EXISTS " + BLOCKED_PHONES_TABLE);

            // create fresh books table
            this.onCreate(db);
        }

    }



    private static final String KEY_ID = "id";
    private static final String KEY_PHONE = "KEY_PHONE";
    private static final String KEY_IS_BLOCKED = "KEY_IS_BLOCKED";

    public void addItem(Phone phone) {
        // 1. get reference to writable DB
        SQLiteDatabase db = this.getWritableDatabase();

初始化代码:

public class ItemDetailFragment extends Fragment {
    /**
     * The fragment argument representing the item ID that this fragment
     * represents.
     */
    public static final String ARG_ITEM_ID = "item_id";

    /**
     * The dummy content this fragment is presenting.
     */
    private DummyContent.DummyItem mItem;
    private PhoneDal phoneDal;
    private CommentDal commentDal;

    /**
     * Mandatory empty constructor for the fragment manager to instantiate the
     * fragment (e.g. upon screen orientation changes).
     */
    public ItemDetailFragment() {
        this.mItem = mItem;
        this.phoneDal = new PhoneDal(getActivity());
        this.commentDal = new CommentDal(getActivity());
    }

    @SuppressLint("ValidFragment")
    public ItemDetailFragment(DummyContent.DummyItem mItem, PhoneDal phoneDal, CommentDal commentDal) {
        this.mItem = mItem;
        this.phoneDal = phoneDal;
        this.commentDal = commentDal;
    }

最佳答案

public ItemDetailFragment() {
    this.phoneDal = new PhoneDal(getActivity());

fragment 构造函数调用 getActivity() 为时过早 - 它将返回 null。在 SQLiteOpenHelper 构造函数中将 null 作为 Context 传递会在调用 get...Database() 时导致异常。

PhoneDal 初始化推迟到 onAttach() 或 fragment 生命周期中的更晚时间。

关于java.lang.NullPointerException 在 android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java :224),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27585374/

相关文章:

mysql - select * from table where something 与 select column from table where something

mysql - SQL 从表中获取行,除非值存在

java - 通过 pom.xml 进行 Restful 配置

java - 类扩展不止一个类Java?

java - 如何使用带有共享字段的 Spring Data JPA 创建自定义查询?

android - 在操作栏选项卡内滑动选项卡

android - 仅以一种方式显示数据的 AdapterView 的数组适配器,(Android)

android - 实时更新 ListView

java - 如何使用Linux screen 启动多个jar?

sql - 当我添加 LIMIT 1 时,使用 ORDER BY 的查询速度是原来的 13 倍