2013-04-21 3 views
2

안드로이드 앱용 캐시를 구현하고 SQLite 데이터베이스를 사용하여 서버 응답을 저장합니다. DB를 다루는 클래스는 아래와 같이 정의됩니다. 또한 데이터베이스 도우미로 사용되는 SQLiteOpenHelper 클래스가 있습니다.SQLiteOpenHelper 널 포인터 예외

CacheDB 클래스가 에서 호출됩니다. public static CacheDB cacheDB = new CacheDB (context);

그리고 나는 또한 cacheDB.fetchDatafromDB ("노래") 메서드를 호출 중입니다.

클래스 코드는 다음과 같습니다.

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

나는 다음과 같은 스택 추적 문제가 여기에있다

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) 

는 무엇입니까?

+3

'CacheDB.java : 124'의 줄은 무엇입니까? – NINCOMPOOP

+0

onCreate()로 추적, 예외가 발생했습니다 –

+3

'==''equals()'메서드를 사용하여 문자열 비교하지 마십시오 – Geros

답변

6

이전에 이미 열어 둔 방법으로 데이터베이스를 열려고했기 때문에 이전과 비슷한 문제가있었습니다. 그게 의미가 있는지 모르겠지만 처음에는 데이터베이스를 닫지 않고 dbHelper.getWritableDatabase() 메서드를 두 번 호출 한 곳을 볼 수 있습니다. 나는 데이터베이스가 이전 방법에 의해 잠겨로 따라서 오류

at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:224) 

하지 내가 여기에 정확한 100 % 야하는 경우도 있는지, 그 문제의 원인이 될 수 있다고 생각하지만,이 도움이되기를 바랍니다. 건배

+1

이 문제를 해결할 수 있었고 새로운 인스턴스를 만들지 않았고 언급 한 내용을 두 번 사용했기 때문에 –

+0

글쎄 도움이 되니 기쁩니다. –

0

SQLiteOpenHelper 생성자로 전달한 컨텍스트가 null입니다.