#java #android #database #sqlite #nullpointerexception
#java #Android #База данных #sqlite #исключение nullpointerexception
Вопрос:
Я пытаюсь получить и установить информацию в свою базу данных, но она продолжает возвращать значение 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 resu<
}
Это всего лишь один из многих методов в этом классе. Однако это не выполняет работу должным образом. При вызове в activity — скажем, при нажатии кнопки, чтобы установить или получить материал, он возвращает исключение с нулевым указателем.
Есть идеи, что я делаю не так?
Комментарии:
1. Вам нужно свести это к SSCCE , который демонстрирует проблему, и опубликовать его здесь. Примечательно, что при выполнении этого вы часто обнаруживаете свою ошибку. Сброс всего вашего кода сюда и вопрос «что не так», как правило, не принесет большой помощи.
2. Если вы получаете исключение nullpointerexception, вы должны предоставить нам трассировку стека. Это упростило бы поиск проблемы, не просматривая весь код.
3. например, есть «с нашей базой данных». в коде, который находится за пределами синтаксиса
4. что это из кода?! -> «с нашей базой данных. this.getReadableDatabase();»
5. в основном используйте LogCat, чтобы отслеживать, какие методы не работают, это было бы отличным местом для начала
Ответ №1:
Вероятно, вы никогда не инициализируете d
. Проверьте свой код, есть ли где-нибудь в нем что-то вроде следующего?
d = new DatabaseHelper(this);
Если нет, то, вероятно, в этом и заключается ваша проблема.