2011-11-13 10 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; 
        } 

そのクラスの多くのメソッドのうちの1つです。しかし、これは適切に仕事をしません。アクティビティで呼び出されたとき - ボタンをクリックして設定または取得する場合は、nullポインタ例外を返します。

何が間違っているのですか?

+5

問題を示してここに投稿する[SSCCE](http://sscce.org/)に煮詰める必要があります。驚くべきことに、これを行うときに間違いを見つけることがよくあります。ここにあなたのコードをすべてダンプし、 "何が間違っている"と尋ねると、一般的には助けにならないでしょう。 –

+1

nullpointerexceptionを取得した場合は、スタックトレースを与える必要があります。すべてのコードを実行することなく問題を見つけるのが簡単になります。 –

+0

たとえば、「私たちのデータベースで」。構文の外にあるコードで –

答えて

-1

おそらくdを初期化することはありません。あなたのコードをチェックしてください。次のような場所がありますか?

d = new DatabaseHelper(this); 

もしそうでなければ、それはおそらくisを発行する場所です。

関連する問題