首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQLiteOpenHelper空指针异常

SQLiteOpenHelper空指针异常
EN

Stack Overflow用户
提问于 2013-04-21 14:43:23
回答 2查看 6.2K关注 0票数 2

类CacheDB从公共静态上下文CacheDB = cacheDB CacheDB(Context)中调用;

这些类的代码如下所示。

代码语言:javascript
复制
package com.songs.lookup;

import java.util.ArrayList;
import java.util.List;

import android.annotation.SuppressLint;
import android.content.Context;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;
import android.database.sqlite.SQLiteStatement;

public class CacheDB {

    public CacheDB(Context context){
        System.out.println("Before constructing ");
        this.context = context;
        this.dbHelper = new CacheDBHelper(context, DATABASE_NAME, null, DATABASE_VERSION);
        System.out.println("After constructing ");

    }
    private Context context;
    private CacheDBHelper dbHelper;
    private static final String DATABASE_NAME = "";
       private static final int DATABASE_VERSION = 1;
       private static final String song_TABLE_NAME = "songs";
       private static final String tune_TABLE_NAME = "tunes";
       private static final String person_TABLE_NAME = "persons";
       private static final String COLUMN_NAME = "name";

       private static final String song_TABLE_CREATE =
                "CREATE TABLE " + song_TABLE_NAME + " (" +
                COLUMN_NAME + " TEXT);";

       private static final String tune_TABLE_CREATE =
                        "CREATE TABLE " + tune_TABLE_NAME + " (" +
                        COLUMN_NAME + " TEXT);";

       private static final String person_TABLE_CREATE =
                        "CREATE TABLE " + person_TABLE_NAME + " (" +
                        COLUMN_NAME + " TEXT);";
   class CacheDBHelper extends SQLiteOpenHelper{    
   public CacheDBHelper(Context context, String name, CursorFactory factory,
            int version) {
       super(context, DATABASE_NAME, null, DATABASE_VERSION);

//     System.out.println("Before the cachedbhelper");
       System.out.println("After the cachedbhelper");

    }

        @Override
        public void onCreate(SQLiteDatabase db) {
            System.out.println("Here inside the oncreate of cacheDBHelper");
            db.execSQL(song_TABLE_CREATE);
            db.execSQL(tune_TABLE_CREATE);
            db.execSQL(person_TABLE_CREATE);

        }

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

   @SuppressLint("NewApi")
public void performOperation(String Operation, String table, ArrayList<String> array1)
   {
       SQLiteDatabase db = dbHelper.getWritableDatabase();

       String INSERT = "insert into "   
                + table + " (" + COLUMN_NAME + ") values (?)";

       String DELETE = "delete from " + table; 

       String FETCH = "select DISTINCT(" + COLUMN_NAME + "from " + table + ")";

       db.beginTransaction();

       SQLiteStatement dbStmt = db.compileStatement(Operation == "INSERT" ? INSERT : DELETE);

       if(Operation == "INSERT")
       {  
            int aSize = array1.size();


                for (int i = 0; i < aSize; i++) {
                    dbStmt.bindString(1, array1.get(i));
                    dbStmt.executeInsert();

            }
       }

       if(Operation == "DELETE")
       {
           dbStmt.executeUpdateDelete();

       }

       if(Operation == "SELECT")
       {
           fetchDatafromDB(table);
       }

       db.setTransactionSuccessful();
       db.endTransaction();


       try {
            db.close();
           } catch (Exception e) {
            e.printStackTrace();
           }
        }

   public List<String> fetchDatafromDB(String table) {
        CacheDBHelper dbHelper = new CacheDBHelper(context, DATABASE_NAME, null, DATABASE_VERSION);
        SQLiteDatabase db = dbHelper.getWritableDatabase();

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

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

        // looping through all rows and adding to list
        if (cursor.moveToFirst()) {
            do {
                cursor.getString(0);
            } while (cursor.moveToNext());
        }
        // return contact list
        return list;
    }
}

我得到了下面的堆栈跟踪

代码语言:javascript
复制
04-21 00:55:15.188: E/AndroidRuntime(790): Caused by: java.lang.NullPointerException
04-21 00:55:15.188: E/AndroidRuntime(790):  at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:224)
04-21 00:55:15.188: E/AndroidRuntime(790):  at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:164)
04-21 00:55:15.188: E/AndroidRuntime(790):  at com.songs.lookup.CacheDB.fetchDatafromDB(CacheDB.java:124)
04-21 00:55:15.188: E/AndroidRuntime(790):  at com.songs.lookup.LookUpData.getData(LookUpData.java:25)
04-21 00:55:15.188: E/AndroidRuntime(790):  at com.songs.MainActivity2.onCreate(MainActivity2.java:64)
04-21 00:55:15.188: E/AndroidRuntime(790):  at android.app.Activity.performCreate(Activity.java:5008)
04-21 00:55:15.188: E/AndroidRuntime(790):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1079)
04-21 00:55:15.188: E/AndroidRuntime(790):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2023)

这里的问题在哪里?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-07-10 20:25:21

我之前遇到过类似的问题,我的问题是因为我试图在一个已经打开数据库的方法中打开它。我不知道这是否有意义,但我可以在这里看到,您可以调用dbHelper.getWritableDatabase()方法两次,而不是在第一次调用之后关闭数据库。我认为这可能是问题的原因,因为数据库被前面的方法锁定了,因此出现了错误

代码语言:javascript
复制
at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:224) 

我不太确定我是不是100%正确,但希望这能有所帮助。干杯

票数 6
EN

Stack Overflow用户

发布于 2015-07-07 20:01:18

您传递给SQLiteOpenHelper构造函数的上下文为空。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16128636

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档