#android #sqlite #nullpointerexception
#Android #sqlite #исключение nullpointerexception
Вопрос:
у меня есть этот код:
package com.rbrlnx.lugares;
public class DataBaseHelper extends SQLiteOpenHelper {
private static String DB_PATH = "/data/data/com.rbrlnx.lugares/databases/";
private static final String DATABASE_NAME="db.db";
SQLiteDatabase db;
String CREATE_TABLE = "CREATE TABLE IF NOT EXISTS lugares ("
"_id INTEGER PRIMARY KEY AUTOINCREMENT, "
"nombre text NOT NULL,"
"descripcion text NOL NULL,"
"latitud real,"
"longitud real,"
"foto String);";
/*Primero se crea constructor, funcion onCreate, onUpgrade,Abrir y Cerrar*/
public DataBaseHelper(Context context){
super(context,DATABASE_NAME,null,1);
}
public void onCreate(SQLiteDatabase db){
db.execSQL(CREATE_TABLE);
}
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("DELETE TABLE IF EXITS " DATABASE_NAME "");
onCreate(db);
}
public void openDataBase() throws SQLException{
//Open the database
String myPath = DB_PATH DATABASE_NAME;
db = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READWRITE);
}
public void close(){
db.close();
}
/*Despues metodos para añadir y obtener datos*/
public long addNombre(String nombre){
ContentValues cv = new ContentValues();
cv.put("nombre", nombre);
return db.insert("lugares", null, cv);
}
public long addDescripcion(String descripcion){
ContentValues cv = new ContentValues();
cv.put("descripcion", descripcion);
return db.insert("lugares", null, cv);
}
public long addLatitud(double latitud){
ContentValues cv = new ContentValues();
cv.put("latitud", latitud);
return db.insert("lugares", null, cv);
}
public long addLongitud(double longitud){
ContentValues cv = new ContentValues();
cv.put("longitud", longitud);
return db.insert("lugares", null, cv);
}
public long addFoto(String foto) {
ContentValues cv = new ContentValues();
cv.put("foto", foto);
return db.insert("lugares", null, cv);
}
public Cursor getNombres(){
Cursor respuesta = db.rawQuery("select nombres from lugares", null);
return respuesta;
}
public long addImagen(Uri directorioimagen){
String imagen = getRealPathFromURI(directorioimagen);
ContentValues cv = new ContentValues();
cv.put("foto", imagen);
return db.insert("lugares", null, cv);
}
}
и это
public class listatab extends ListActivity{
Context context;
ListView listanombres;
DataBaseHelper ayudabbdd;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Cursor nombresC;
nombresC = ayudabbdd.getNombres();
startManagingCursor(nombresC);
ListAdapter adapter = new SimpleCursorAdapter(this, R.layout.listatab, nombresC, new String[] { "nombre" }, new int[] { R.id.lista });
this.setListAdapter(adapter);
this.getListView().setTextFilterEnabled(true);
}
@Override
protected void onDestroy() {
super.onDestroy();
if (ayudabbdd != null) {
ayudabbdd.close();
}
}
}
И лог-кот выдает мне эту ошибку
10-10 21:25:38.115: ERROR/Database(26775): close() was never explicitly called on database '/data/data/com.rbrlnx.lugares/databases/db.db'
10-10 21:25:38.115: ERROR/Database(26775): android.database.sqlite.DatabaseObjectNotClosedException: Application did not close the cursor or database object that was opened here
и
10-10 21:35:48.831: ERROR/AndroidRuntime(27458): FATAL EXCEPTION: main
10-10 21:35:48.831: ERROR/AndroidRuntime(27458): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.rbrlnx.lugares/com.rbrlnx.lugares.listatab}: java.lang.NullPointerException
10-10 21:35:48.831: ERROR/AndroidRuntime(27458): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1872)
10-10 21:35:48.831: ERROR/AndroidRuntime(27458): at android.app.ActivityThread.startActivityNow(ActivityThread.java:1692)
10-10 21:35:48.831: ERROR/AndroidRuntime(27458): at android.app.LocalActivityManager.moveToState(LocalActivityManager.java:127)
10-10 21:35:48.831: ERROR/AndroidRuntime(27458): at android.app.LocalActivityManager.startActivity(LocalActivityManager.java:339)
10-10 21:35:48.831: ERROR/AndroidRuntime(27458): at android.widget.TabHost$IntentContentStrategy.getContentView(TabHost.java:656)
10-10 21:35:48.831: ERROR/AndroidRuntime(27458): at android.widget.TabHost.setCurrentTab(TabHost.java:326)
10-10 21:35:48.831: ERROR/AndroidRuntime(27458): at android.widget.TabHost$2.onTabSelectionChanged(TabHost.java:132)
10-10 21:35:48.831: ERROR/AndroidRuntime(27458): at android.widget.TabWidget$TabClickListener.onClick(TabWidget.java:458)
10-10 21:35:48.831: ERROR/AndroidRuntime(27458): at android.view.View.performClick(View.java:2533)
10-10 21:35:48.831: ERROR/AndroidRuntime(27458): at android.view.View$PerformClick.run(View.java:9320)
10-10 21:35:48.831: ERROR/AndroidRuntime(27458): at android.os.Handler.handleCallback(Handler.java:587)
10-10 21:35:48.831: ERROR/AndroidRuntime(27458): at android.os.Handler.dispatchMessage(Handler.java:92)
10-10 21:35:48.831: ERROR/AndroidRuntime(27458): at android.os.Looper.loop(Looper.java:150)
10-10 21:35:48.831: ERROR/AndroidRuntime(27458): at android.app.ActivityThread.main(ActivityThread.java:4389)
10-10 21:35:48.831: ERROR/AndroidRuntime(27458): at java.lang.reflect.Method.invokeNative(Native Method)
10-10 21:35:48.831: ERROR/AndroidRuntime(27458): at java.lang.reflect.Method.invoke(Method.java:507)
10-10 21:35:48.831: ERROR/AndroidRuntime(27458): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:849)
10-10 21:35:48.831: ERROR/AndroidRuntime(27458): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:607)
10-10 21:35:48.831: ERROR/AndroidRuntime(27458): at dalvik.system.NativeStart.main(Native Method)
10-10 21:35:48.831: ERROR/AndroidRuntime(27458): Caused by: java.lang.NullPointerException
10-10 21:35:48.831: ERROR/AndroidRuntime(27458): at com.rbrlnx.lugares.listatab.onCreate(listatab.java:21)
10-10 21:35:48.831: ERROR/AndroidRuntime(27458): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1072)
10-10 21:35:48.831: ERROR/AndroidRuntime(27458): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1836)
10-10 21:35:48.831: ERROR/AndroidRuntime(27458): ... 18 more
Я не знаю почему, кто-нибудь может мне помочь, пожалуйста?
Комментарии:
1. Легче отлаживать приложения Android, когда вы повторно добавляете исключения в собственный поток, потому что действия Android просто вызывают исключения RuntimeExceptions без сохранения трассировки стека.
2. кроме того, вы написали ‘NOL NULL’ в своем запросе
3. Как я могу отладить приложение Android, когда я создаю исключение? В db.db есть данные. Я удаляю значение not null в запросе
4. я не ? что это значит? Вы можете использовать eclipse с эмулятором, поэтому его легко отлаживать…
5. но могу ли я остановиться только в строке исключения? (Извините за мой английский)
Ответ №1:
Вы не создали свой экземпляр DatabaseHelper. Вам нужно:
ayudabbdd = new DataBaseHelper(this);
перед вызовом getNombers()
метода.
Комментарии:
1. Я удаляю эту строку по ошибке, но со строкой тот же результат
Ответ №2:
Используйте его
DataBaseHelper ayudabbdd=new DataBaseHelper(this);
SQLiteDatabase db=ayudabbdd.getReadableDatabase();
Cursor cur=db.<Method Name which you want to use>;
но я понятия не имею, что такое использование
nombresC = ayudabbdd.getNombres();
и у вас много орфографических ошибок при создании таблицы, удалите их также после проверки,
like nol null in place of not null
Ответ №3:
Перед вызовом необходимо выполнить вызов вручную openDataBase
onCreate
db.execSQL
:
public void onCreate(SQLiteDatabase db){
try {
openDataBase();
db.execSQL(CREATE_TABLE);
} catch (Exception e) {
// handle exception
}
}
Аналогично, ваш onUpgrade
метод должен сначала открыть базу данных перед вызовом db.execSQL
, иначе вы получите ошибку того же типа. И я не думаю, что вам следует вручную вызывать onCreate
from onUpgrade
, найдите другой способ выполнить то, что вы пытаетесь там.
Комментарии:
1. ОШИБКА/AndroidRuntime(380): java.lang.RuntimeException: ComponentInfo{com.rbrlnx.lugares/com.rbrlnx.lugares.listatab}: java.lang. ОШИБКА ИСКЛЮЧЕНИЯ NullPointerException/ AndroidRuntime(380): в android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1647) 10-10 23:21:09.460: ОШИБКА / AndroidRuntime(380): вызвано: java.lang. Исключение NullPointerException 10-10 23:21:09.460: ОШИБКА/AndroidRuntime(380): в com.rbrlnx.lugares. DatabaseHelper.getNombres (DatabaseHelper.java:111) 10-10 23:21:09.460: ОШИБКА / AndroidRuntime(380): в com.rbrlnx.lugares.listatab.onCreate(listatab.java:22) Тот же результат..
2. я открыл db.db с помощью редактора sqlite и добавляю регистры вручную, а в eclipse, если использовать перспективу ddms в исследовании файла, я вижу, что в db.db много регистров..