0

私のSQLデータベースの削除方法は、データベースからエントリを削除しません。null ポインター例外が発生します。

10-18 00:44:25.069: E/AndroidRuntime(17968): java.lang.NullPointerException 10-18 00:44:25.069: E/AndroidRuntime(17968): com.weather.app.LocationDB.deleteLocation(LocationDB.ジャワ:98)

public class LocationDB extends SQLiteOpenHelper {

private static final int DATABASE_VERSION = 1;

// Database Name
private static final String DATABASE_NAME = "locationManager";

private static final String TABLE_LOCATIONS = "locations";
private static final String KEY_ID = "id";
private static final String KEY_LOCATION = "location";
private static final String KEY_COUNTRY = "country";
private SQLiteDatabase db;

public LocationDB(Context context) {
    super(context, DATABASE_NAME, null, DATABASE_VERSION);
}

@Override
public void onCreate(SQLiteDatabase db) {

    String sql = "CREATE TABLE IF NOT EXISTS " + TABLE_LOCATIONS + " ( "
            + KEY_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + KEY_LOCATION
            + " TEXT, " + KEY_COUNTRY
            + " TEXT, " + " INTEGER)";
    db.execSQL(sql);
}

@Override
public void onUpgrade(SQLiteDatabase db, int oldV, int newV) {
    db.execSQL("DROP TABLE IF EXISTS " + TABLE_LOCATIONS);
    onCreate(db);
}
public void addLocation(LocationName location) {
    SQLiteDatabase db = this.getWritableDatabase();

    ContentValues values = new ContentValues();
    values.put(KEY_LOCATION, location.getTaskName());
    values.put(KEY_COUNTRY, location.getTaskCountry());

    db.insert(TABLE_LOCATIONS, null, values);
}

public List<LocationName> getAllLocations() {
    List<LocationName> locList = new ArrayList<LocationName>();
    // Select All Query
    String selectQuery = "SELECT  * FROM " + TABLE_LOCATIONS;

    SQLiteDatabase db = this.getWritableDatabase();
    Cursor cursor = db.rawQuery(selectQuery, null);

    // looping through all rows and adding to list
    if (cursor.moveToFirst()) {
        do {
            LocationName task = new LocationName();
            task.setId(cursor.getInt(0));
            task.setTaskName(cursor.getString(1));
            task.setTaskCountry(cursor.getString(2));
            // Adding contact to list
            locList.add(task);
        } while (cursor.moveToNext());
    }
    return locList;
}
public boolean deleteLocation(long rowId) {
    return db.delete(TABLE_LOCATIONS, KEY_ID + "=" + rowId, null) > 0;
}

}

その後、アプリを再起動してもエントリは削除されず、行を追加するための addLocation メソッドは正常に機能します。

LocationSettings アクティビティ:

public class LocationSettings extends Activity {
protected static LocationDB db;
static List<LocationName> list;
MyAdapter adapt;
private static TextView name;
private ListView listView;
private static final int DLG_EXAMPLE1 = 0;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_location_settings);
    getActionBar().setDisplayHomeAsUpEnabled(true);
    getActionBar().setHomeButtonEnabled(true);
    db = new LocationDB(this);
    list = db.getAllTasks();
    adapt = new MyAdapter(this, R.layout.drawer_list_item, list);
    listView = (ListView) findViewById(R.id.left_drawer);
    listView.setAdapter(adapt);
    SwipeDismissListViewTouchListener touchListener =
            new SwipeDismissListViewTouchListener(
                    listView,
                    new SwipeDismissListViewTouchListener.DismissCallbacks() {
                        @Override
                        public boolean canDismiss(int position) {
                            return true;
                        }

                        @Override
                        public void onDismiss(ListView listView, int[] reverseSortedPositions) {
                            for (int position : reverseSortedPositions) {
                                db.deleteTask(position);
                                adapt.remove(adapt.getItem(position));
                            }
                        }
                    });

    listView.setOnItemClickListener(new DrawerItemClickListener());
    listView.setOnTouchListener(touchListener);

}
public class DrawerItemClickListener implements ListView.OnItemClickListener {
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        db.deleteTask(position);
        adapt.notifyDataSetChanged();
    }
}
private class MyAdapter extends ArrayAdapter<LocationName> {

    Context context;
    List<LocationName> taskList = new ArrayList<LocationName>();
    int layoutResourceId;

    public MyAdapter(Context context, int layoutResourceId,
            List<LocationName> objects) {
        super(context, layoutResourceId, objects);
        this.layoutResourceId = layoutResourceId;
        this.taskList = objects;
        this.context = context;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        if (convertView == null) {
            LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = inflater.inflate(R.layout.drawer_list_item,parent, false);
            name = (TextView) convertView.findViewById(R.id.text1);
        } 
        LocationName current = taskList.get(position);
        name.setText(current.getTaskName());
        return convertView;
    }

}

}

4

2 に答える 2

2

dbで delete メソッドを呼び出す前に初期化するのを忘れていますdeleteLocation

public int deleteLocation(long rowId) {
    SQLiteDatabase db = this.getWritableDatabase();
    return db.delete(TABLE_LOCATIONS, KEY_ID + " = ?", 
                             new String[] { String.valueOf(rowId) });
}
于 2013-10-17T19:55:30.920 に答える