база данных android sqlite, нулевой указатель - PullRequest
3 голосов
/ 14 ноября 2011

Я пытаюсь получить и установить информацию в моей базе данных, но она продолжает возвращать ноль.

Я проверил это, и, похоже, что-то не так с моим DatabaseHelper классом и с тем, как я его использую. Это мой DatabaseHelper класс. Сама база данных уже создана с использованием менеджера баз данных sqlite и находится в папке активов.

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, который в свою очередь используется в моей активности signUp, где я просто вызываю метод с параметрами.

        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 Ответ

0 голосов
/ 14 ноября 2011

Вы, вероятно, никогда не инициализируете d. Проверьте ваш код, есть ли в нем что-то похожее на следующее?

d = new DatabaseHelper(this);

Если нет, то это, вероятно, там, где вы выпускаете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...