2011-11-13 6 views
3

내 데이터베이스로 정보를 가져오고 설정하려고하지만 null을 계속 반환합니다.android sqlite 데이터베이스, null 포인터

나는 그것을 테스트 한 결과 내 DatabaseHelper 클래스에 문제가있는 것 같으며 어떻게 사용하고 있는지 알 수 있습니다. 이것은 내 DatabaseHelper 클래스입니다. 데이터베이스 자체는 이미 sqlite 데이터베이스 관리 프로그램을 사용하여 작성되었으며 assets 폴더에 있습니다.

public class DatabaseHelper extends SQLiteOpenHelper{ 

private static String DB_PATH = "/data/data/package_name/databases/"; 

private static String DB_NAME = "example.db"; 
private static int DB_VERSION = 1; 

private SQLiteDatabase myDataBase; 

private final Context myContext; 


public DatabaseHelper(Context context) { 
    super(context, DB_NAME, null, DB_VERSION); 
    this.myContext = context; 
} 


public void createDataBase() throws IOException{ 

    boolean dbExist = checkDataBase(); 

    if(dbExist){ 
    }else{ 


    with our database. 
     this.getReadableDatabase(); 

     try { 

      copyDataBase(); 

     } catch (IOException e) { 

      throw new Error("Error copying database"); 

     } 
    } 

} 


    private boolean checkDataBase(){ 

    SQLiteDatabase checkDB = null; 

    try{ 
     String myPath = DB_PATH + DB_NAME; 
     checkDB = SQLiteDatabase.openDatabase(myPath, null, 
    SQLiteDatabase.OPEN_READONLY); 

    }catch(SQLiteException e){ 


    } 

    if(checkDB != null){ 

     checkDB.close(); 

    } 

    return checkDB != null ? true : false; 
    } 


    private void copyDataBase() throws IOException{ 

    InputStream myInput = myContext.getAssets().open(DB_NAME); 

    String outFileName = DB_PATH + DB_NAME; 

    OutputStream myOutput = new FileOutputStream(outFileName); 

    byte[] buffer = new byte[1024]; 
    int length; 
    while ((length = myInput.read(buffer))>0){ 
     myOutput.write(buffer, 0, length); 
    } 

    myOutput.flush(); 
    myOutput.close(); 
    myInput.close(); 

} 


    public void openDataBase() throws SQLException{ 

    String myPath = DB_PATH + DB_NAME; 
    myDataBase = SQLiteDatabase.openDatabase(myPath, null, 
    SQLiteDatabase.OPEN_READWRITE); 


     } 

    public void setStuff (String columns, String table, String values, String    
    whereclause){ 
    openDataBase(); 
    myDataBase.execSQL("INSERT INTO " 
      + table 
      + " "+columns 
      + " VALUES ('"+values+")" + " WHERE "+whereclause); 
    close(); 

    } 

    public ArrayList<String> getStuff (String column, String table, String whereclause){ 
    ArrayList<String> stuffList = new ArrayList<String>(); 
    openDataBase(); 
    Cursor c = myDataBase.rawQuery("SELECT "+column + 
      " FROM " +table 
      + " WHERE "+whereclause, 
      null); 
    int index = c.getColumnIndex(column); 
    if (c != null) { 
     if (c.isFirst()) { 
       do { 

         String stuff = c.getString(index).toString(); 
         results.add(data); 
       } while (c.getString(index)!=null); 
     } 
    } 
    close(); 
    return stuffList; 


} 


    @Override 
public synchronized void close() { 

     if(myDataBase != null) 
      myDataBase.close(); 

     super.close(); 

} 

@Override 
public void onCreate(SQLiteDatabase db) { 
    try { 
     createDataBase(); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
} 




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

} 


} 

실제로이 데이터베이스 도우미를 사용하려고 내 클래스는, 예를 들면 다음으로, 난 그냥 매개 변수와 메소드를 호출 내 가입 활동에 사용 돌았에 내 PersonDBController 클래스.

 public class PersonDBController { 
      private DatabaseHelper d; 
      private Person p; 


       public String getFirstname(int userIDnum) { 
         ArrayList<String> fn = 
                 d.getStuff("firstname", 
                 "people", "userIDnum  
                 ="+userIDnum); 
         String result = fn.get(0); 
         return result; 
        } 

그 클래스의 많은 메소드 중 하나 일뿐입니다. 그러나 이것은 제대로 작동하지 않습니다. 액티비티에서 호출 될 때 - 버튼을 클릭하여 설정하거나 가져 오는 물건을 클릭하면 null 포인터 예외가 반환됩니다.

무엇이 잘못 되었습니까?

+5

문제를 설명하고 여기에 게시하려면 [SSCCE] (http://sscce.org/)로 압축해야합니다. 현저하게, 이것을 할 때 종종 실수를하게됩니다. 여기에 모든 코드를 덤핑하고 "무엇이 잘못 되었습니까"라는 질문은 일반적으로 도움이되지 않습니다. –

+1

nullpointerexception을 얻으면 스택 추적을 제공해야합니다. 모든 코드를 거치지 않고도 문제를 쉽게 찾을 수 있습니다. –

+0

예를 들어 "우리 데이터베이스가 있습니다." 구문 외의 코드에서 –

답변

-1

당신은 아마 d을 초기화하지 않을 것입니다. 코드를 확인하십시오. 다음과 같은 코드가 있습니까?

d = new DatabaseHelper(this); 

그렇지 않은 경우 그럴 것입니다.

관련 문제