Я довольно новичок в android (и программировании), поэтому надеюсь, что этот вопрос не слишком глуп. Я попытался ответить на свой вопрос с помощью обучающих программ и без труда выполнить поиск в stackoverflow.Android: удалите элемент SQLite из списка. NullPointerException
Я пытаюсь заполнить список с помощью базы данных SQLite: когда я нажимаю элемент в списке, я хочу, чтобы он также удалялся из списка и из базы данных. Благодаря отладке я считаю, что проблема связана с моими методами ArrayAdapter, поскольку даже базовые методы, подобные «getCount()», по-видимому, не дают результатов.
Для моего SQLite класса DatabaseHandler, вот способ получить все элементы в базе данных и для удаления элемента:
// Getting All breadcrumbs
public List<Breadcrumb> getAllBreadcrumbs() {
List<Breadcrumb> breadcrumbList = new ArrayList<Breadcrumb>();
// Select All Query
String selectQuery = "SELECT * FROM " + TABLE_BREADCRUMBS;
SQLiteDatabase db = this.getWritableDatabase();
Cursor cursor = db.rawQuery(selectQuery, null);
// looping through all rows and adding to list
if (cursor.moveToFirst()) {
do {
Breadcrumb breadcrumb = new Breadcrumb();
breadcrumb.setId(Integer.parseInt(cursor.getString(0)));
breadcrumb.setBreadcrumbLatitude(cursor.getInt(1));
breadcrumb.setBreadcrumbLongitude(cursor.getInt(2));
// Adding location to list
breadcrumbList.add(breadcrumb);
} while (cursor.moveToNext());
}
// Deleting single breadcrumb
public void deleteBreadcrumb(Breadcrumb breadcrumb) {
SQLiteDatabase db = this.getWritableDatabase();
int id = breadcrumb.getId();
System.out.println("Comment deleted with id: " + id);
db.delete(TABLE_BREADCRUMBS, KEY_ID
+ " = " + id, null);
db.close();
}
XML-макет для беспокойной деятельности:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".CollectedBreadcrumbsActivity" >
<ListView
android:id="@+id/list"
android:layout_width="match_parent"
android:layout_height="wrap_content" >
</ListView>
</LinearLayout>
И вот деятельность:
public class CollectedBreadcrumbsActivity extends Activity implements OnItemClickListener {
private ListView listview;
private DatabaseHandler db;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_collected_breadcrumbs);
DatabaseHandler db = new DatabaseHandler(this);
List<Breadcrumb> breadcrumbs = db.getAllBreadcrumbs();
listview = (ListView) findViewById(R.id.list);
ArrayAdapter<Breadcrumb> adapter = new ArrayAdapter<Breadcrumb>(this,
android.R.layout.simple_list_item_1, breadcrumbs);
listview.setAdapter(adapter);
listview.setOnItemClickListener(this);
}
public void onItemClick(AdapterView<?> l, View v, int position, long id) {
Log.d("HelloListView", "You clicked Item: " + id + " at position:" + position);
Log.d("HelloListView", "Number of items in adapter:" + listview.getAdapter().getCount());
@SuppressWarnings("unchecked")
ArrayAdapter<Breadcrumb> adapter = (ArrayAdapter<Breadcrumb>) listview.getAdapter();
if (listview.getAdapter().getCount() > 0) {
Breadcrumb breadcrumb = (Breadcrumb) listview.getAdapter().getItem(position);
db.deleteBreadcrumb(breadcrumb);
adapter.remove(breadcrumb);
}
adapter.notifyDataSetChanged();
}
}
Список просматривается хорошо, но wh ный я нажимаю элемент в списке, то приложение падает при следующем журнале:
05-07 19:08:40.671: D/HelloListView(29562): You clicked Item: 5 at position:5
05-07 19:08:40.671: W/dalvikvm(29562): threadid=1: thread exiting with uncaught exception (group=0x40e4c438)
05-07 19:08:40.671: E/AndroidRuntime(29562): FATAL EXCEPTION: main
05-07 19:08:40.671: E/AndroidRuntime(29562): java.lang.NullPointerException
05-07 19:08:40.671: E/AndroidRuntime(29562): at com.detimil.breadcrumbs1.CollectedBreadcrumbsActivity.onItemClick(CollectedBreadcrumbsActivity.java:42)
05-07 19:08:40.671: E/AndroidRuntime(29562): at android.widget.AdapterView.performItemClick(AdapterView.java:298)
05-07 19:08:40.671: E/AndroidRuntime(29562): at android.widget.AbsListView.performItemClick(AbsListView.java:1268)
05-07 19:08:40.671: E/AndroidRuntime(29562): at android.widget.AbsListView$PerformClick.run(AbsListView.java:3059)
05-07 19:08:40.671: E/AndroidRuntime(29562): at android.widget.AbsListView$1.run(AbsListView.java:3950)
05-07 19:08:40.671: E/AndroidRuntime(29562): at android.os.Handler.handleCallback(Handler.java:615)
05-07 19:08:40.671: E/AndroidRuntime(29562): at android.os.Handler.dispatchMessage(Handler.java:92)
05-07 19:08:40.671: E/AndroidRuntime(29562): at android.os.Looper.loop(Looper.java:137)
05-07 19:08:40.671: E/AndroidRuntime(29562): at android.app.ActivityThread.main(ActivityThread.java:4950)
05-07 19:08:40.671: E/AndroidRuntime(29562): at java.lang.reflect.Method.invokeNative(Native Method)
05-07 19:08:40.671: E/AndroidRuntime(29562): at java.lang.reflect.Method.invoke(Method.java:511)
05-07 19:08:40.671: E/AndroidRuntime(29562): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1004)
05-07 19:08:40.671: E/AndroidRuntime(29562): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:771)
05-07 19:08:40.671: E/AndroidRuntime(29562): at dalvik.system.NativeStart.main(Native Method)
Опять же, я думаю, что проблема должна быть с моей ArrayAdapter, потому что даже этот журнал Log.d("HelloListView", "Number of items in adapter:" + listview.getAdapter().getCount());
ничего до аварий приложения не производит.
Если у кого-то есть мысли по этому поводу, я очень благодарен за помощь. Опять же, извините, если это глупый вопрос.
спасибо.
@peopletrees, просто удалить 'DatabaseHandler', из DatabaseHandler дб = новая DatabaseHandler (это); и принять ответ pragnani – umesh
в строке private DatabaseHandler db; вы создаете только ссылку, а не объект, а создаваемый объект является локальным для onCreate, поэтому объект будет null за пределами oncreate. – umesh
@peopletrees Pragnani прав. Он просто не очень хорошо объясняет это. У вас есть частный член класса 'db' типа' DatabaseHelpern', в вашей 'CollectedBreadCrumbsActivity'. Внутри 'onCreate()', вы объявляете локальную переменную 'db' также типа' DatabaseHelper'.Вы можете устранить эту двусмысленность в Java, используя 'CollectedBreadCrumbsActivity.this.db', чтобы ссылаться на член класса' db'. Однако мы предполагаем, что вы не хотели создавать локальный экземпляр db, а затем выбрасывали его, и вы имели в виду скорее инициализировать член класса 'db'. Делать так, как предлагает Прагняни, это исправит. – dcow