问题
Im trying to update a row in my table but the update function seems not responding. Is everything ok with my function, or i'm I somewhere wrong?
public int editChild(int id, String name, String dob,
int gender, double weight, double lenght, int color, int status) {
ContentValues args = new ContentValues();
args.put("name", name);
args.put("dob", dob);
args.put("weight", weight);
args.put("lenght", lenght);
args.put("color", color);
args.put("status", status);
return database.update(TABLE_CHILDREN, args, "id" + "='" + id
+ "'", null);
}
Now i saw logcat, throws these exceptions:
04-03 22:38:32.984: I/dalvikvm(8803): Uncaught exception thrown by finalizer (will be discarded):
04-03 22:38:32.984: I/dalvikvm(8803): Ljava/lang/IllegalStateException;: Finalizing cursor android.database.sqlite.SQLiteCursor@44c70c20 on children that has not been deactivated or closed
04-03 22:38:32.984: I/dalvikvm(8803): at android.database.sqlite.SQLiteCursor.finalize(SQLiteCursor.java:596)
04-03 22:38:32.984: I/dalvikvm(8803): at dalvik.system.NativeStart.run(Native Method)
04-03 22:38:32.984: I/dalvikvm(8803): Uncaught exception thrown by finalizer (will be discarded):
04-03 22:38:32.984: I/dalvikvm(8803): Ljava/lang/IllegalStateException;: Finalizing cursor android.database.sqlite.SQLiteCursor@44c702f8 on children that has not been deactivated or closed
04-03 22:38:32.984: I/dalvikvm(8803): at android.database.sqlite.SQLiteCursor.finalize(SQLiteCursor.java:596)
04-03 22:38:32.984: I/dalvikvm(8803): at dalvik.system.NativeStart.run(Native Method)
04-03 22:38:33.004: I/dalvikvm(8803): Uncaught exception thrown by finalizer (will be discarded):
04-03 22:38:33.024: I/dalvikvm(8803): Ljava/lang/IllegalStateException;: Finalizing cursor android.database.sqlite.SQLiteCursor@44c2bc20 on children that has not been deactivated or closed
04-03 22:38:33.024: I/dalvikvm(8803): at android.database.sqlite.SQLiteCursor.finalize(SQLiteCursor.java:596)
04-03 22:38:33.024: I/dalvikvm(8803): at dalvik.system.NativeStart.run(Native Method)
04-03 22:38:33.064: I/dalvikvm(8803): Uncaught exception thrown by finalizer (will be discarded):
04-03 22:38:33.084: I/dalvikvm(8803): Ljava/lang/IllegalStateException;: Finalizing cursor android.database.sqlite.SQLiteCursor@44c82e68 on children that has not been deactivated or closed
04-03 22:38:33.084: I/dalvikvm(8803): at android.database.sqlite.SQLiteCursor.finalize(SQLiteCursor.java:596)
04-03 22:38:33.084: I/dalvikvm(8803): at dalvik.system.NativeStart.run(Native Method)
The DatabaseHelper Class:
package com.app;
import java.util.ArrayList;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
public class DatabaseHelper extends SQLiteOpenHelper {
public static final String TABLE_SETTINGS = "settings";
public static final String TABLE_LOCATIONS = "locations";
public static final String TABLE_LOCATIONCATEGORIES = "locationcategories";
public static final String TABLE_CATEGORIES = "categories";
public static final String TABLE_ARTICLES = "articles";
public static final String TABLE_DEF_CALENDAR = "DefCalendar";
public static final String TABLE_USERS = "users";
public static final String TABLE_CHILDREN = "children";
public static final String TABLE_DIARY = "diary";
public static final String DROP_TABLE = "drop table if exists";
private static final String DATABASE_NAME = "BabyApp.db";
private static final int DATABASE_VERSION = 1;
private boolean isOpen = false;
private Context context;
private SQLiteDatabase database;
private DatabaseHelper dbHelper;
// Database creation sql statements
private static final String CREATE_TABLE_SETTINGS = "create table "
+ TABLE_SETTINGS
+ " ("
+ "id integer primary key autoincrement, value text, timestamp text);";
private static final String CREATE_TABLE_LOCATIONS = "create table "
+ TABLE_LOCATIONS
+ " (id text primary key, categoryId integer, name text, "
+ "long numeric, lat numeric, description text, timestamp text, status integer);";
private static final String CREATE_TABLE_LOCATIONCATEGORIES = "create table "
+ TABLE_LOCATIONCATEGORIES
+ " ("
+ "id integer primary key autoincrement, name text, timestamp text, status integer);";
private static final String CREATE_TABLE_CATEGORIES = "create table "
+ TABLE_CATEGORIES
+ " ("
+ "id integer primary key autoincrement, parent integer, ageFrom integer, ageTO integer,"
+ " dateFrom text, dateTo text, timestamp text);";
private static final String CREATE_TABLE_ARTICLES = "create table "
+ TABLE_ARTICLES
+ " ("
+ "id integer primary key autoincrement,parent integer not null, foreign key (parent) references "
+ TABLE_CATEGORIES + " (id), name text, ageFrom integer,"
+ " ageTo integer, dateFrom text, dateTo text, status integer);";
private static final String CREATE_TABLE_DEF_CALENDAR = "create table "
+ TABLE_DEF_CALENDAR
+ " ("
+ "id integer primary key autoincrement, title text, ageFrom integer, ageTo integer,articleId integer, foreign key (articleId) references "
+ TABLE_ARTICLES + "(id), timestamp text, status integer)";
private static final String CREATE_TABLE_USERS = "create table "
+ TABLE_USERS
+ " (id integer primary key autoincrement, email text, pass text, timestamp text);";
private static final String CREATE_TABLE_CHILDREN = "create table "
+ TABLE_CHILDREN
+ " ("
+ "id integer primary key autoincrement, name text, gender integer, dob text, weight numeric, lenght numeric, color integer, status integer, timestamp text);";
private static final String CREATE_TABLE_DIARY = "create table "
+ TABLE_DIARY
+ " ("
+ "id integer primary key autoincrement, foreign key(child) references"
+ TABLE_CHILDREN
+ " (id), date text, text text, timestamp text, status integer);";
public DatabaseHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
this.context = context;
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(CREATE_TABLE_SETTINGS);
// db.execSQL(CREATE_TABLE_ARTICLES);
db.execSQL(CREATE_TABLE_CATEGORIES);
db.execSQL(CREATE_TABLE_CHILDREN);
// db.execSQL(CREATE_TABLE_DEF_CALENDAR);
// db.execSQL(CREATE_TABLE_DIARY);
db.execSQL(CREATE_TABLE_LOCATIONCATEGORIES);
db.execSQL(CREATE_TABLE_LOCATIONS);
db.execSQL(CREATE_TABLE_USERS);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL(TABLE_SETTINGS);
db.execSQL(TABLE_ARTICLES);
db.execSQL(TABLE_CATEGORIES);
db.execSQL(TABLE_CHILDREN);
db.execSQL(TABLE_DEF_CALENDAR);
db.execSQL(TABLE_DIARY);
db.execSQL(TABLE_LOCATIONCATEGORIES);
db.execSQL(TABLE_LOCATIONS);
db.execSQL(TABLE_USERS);
onCreate(db);
}
public DatabaseHelper open() throws SQLException {
dbHelper = new DatabaseHelper(context);
database = dbHelper.getWritableDatabase();
return this;
}
@Override
public void onOpen(SQLiteDatabase db) {
isOpen = true;
super.onOpen(db);
}
public boolean isOpen() {
return isOpen;
}
public DatabaseHelper openToWrite() throws android.database.SQLException {
dbHelper = new DatabaseHelper(context);
database = dbHelper.getWritableDatabase();
return this;
}
public void close() {
database.close();
}
public boolean setDefaultBaby(int currentActiveId, int id) {
ContentValues args = new ContentValues();
args.put("status", "0");
ContentValues newargs = new ContentValues();
newargs.put("status", "1");
return (database.update(TABLE_CHILDREN, args, "id" + "='"
+ currentActiveId + "'", null) > 0 && database.update(
TABLE_CHILDREN, newargs, "id" + "='" + id + "'", null) > 0);
}
public int editChild(int id, String name, String dob, int gender,
double weight, double lenght, int color, int status) {
ContentValues args = new ContentValues();
args.put("name", name);
args.put("dob", dob);
args.put("weight", weight);
args.put("lenght", lenght);
args.put("color", color);
args.put("status", status);
return database.update(TABLE_CHILDREN, args, "id" + "='" + id + "'",
null);
}
public String getActiveChild(int id) {
Cursor Activecur = database.query(true, TABLE_CHILDREN, null, "id = "
+ id, null, null, null, null, null);
if (Activecur.moveToFirst()) {
return Activecur.getString(Activecur.getColumnIndex("name"));
} else
return null;
}
public long createChild(String name, int gender, String dob, double weight,
double lenght, int color, int status, String timestamp) {
ContentValues initialValues = new ContentValues();
initialValues.put("name", name);
initialValues.put("gender", gender);
initialValues.put("dob", dob);
initialValues.put("weight", weight);
initialValues.put("lenght", lenght);
initialValues.put("color", color);
Cursor Createcur = database.query(TABLE_CHILDREN, null, null, null,
null, null, null);
if (Createcur.getCount() == 0)
initialValues.put("status", 1);
else
initialValues.put("status", 0);
initialValues.put("timestamp", timestamp);// yyyy-MM-dd HH:mm:ss
return database.insert(TABLE_CHILDREN, null, initialValues);
}
public boolean deleteChild(int id) {
String where = "id" + "='" + id + "'";
database.delete(TABLE_CHILDREN, where, null);
return database.delete(TABLE_CHILDREN, where, null) > 0;
}
public ArrayList<Child> getAllChildren() {
Cursor getAllCursor = database.query(TABLE_CHILDREN, null, null, null,
null, null, null);
ArrayList<Child> arr = new ArrayList<Child>();
getAllCursor.moveToFirst();
while (getAllCursor.isAfterLast() == false) {
// name text, gender integer, dob text, weight numeric, lenght
// numeric, colod integer, status integer, timestamp text);";
arr.add(new Child(
getAllCursor.getInt(getAllCursor.getColumnIndex("id")),
getAllCursor.getString(getAllCursor.getColumnIndex("name")),
getAllCursor.getInt(getAllCursor.getColumnIndex("gender")),
getAllCursor.getString(getAllCursor.getColumnIndex("dob")),
getAllCursor.getString(getAllCursor
.getColumnIndex("timestamp")),
getAllCursor.getInt(getAllCursor.getColumnIndex("status")),
getAllCursor.getInt(getAllCursor.getColumnIndex("color")),
getAllCursor.getFloat(getAllCursor.getColumnIndex("weight")),
getAllCursor.getFloat(getAllCursor.getColumnIndex("lenght"))));
getAllCursor.moveToNext();
}
// getAllCursor.close();
return arr;
}
public int getDefaultBabyID() {
String where = "status = 1";
Cursor cur = database.query(true, TABLE_CHILDREN, null, where, null,
null, null, null, null);
int id;
if (cur.moveToFirst())
id = cur.getInt(cur.getColumnIndex("id"));
else
id = 0;
cur.close();
return id;
}
public int getId() {
Cursor cur = database.query(true, TABLE_CHILDREN, null, null, null,
null, null, null, null);
cur.moveToLast();
int id = cur.getInt(cur.getColumnIndex("id"));
cur.close();
return id;
}
public int getIdForName(String name) {
String where = "name='" + name + "'";
Cursor cur = database.query(true, TABLE_CHILDREN, null, where, null,
null, null, null, null);
cur.moveToLast();
cur.close();
return cur.getInt(cur.getColumnIndex("id"));
}
}
回答1:
Two things.
1) You need to close your cursor. Personally, I let the framwork handle that by using startManagingCursor(mYourCursor);
rather than having to try and remember to do it myself.
2) Android expects your row id to be "_id", so you might try changing all your tables to use that.
回答2:
Try this code:
This is in your DatabaseHelper class,
public void updateRow(long rowId, String name, String value1, String value2, String value3, String value4) {
SQLiteDatabase db = this.getWritableDatabase();
ContentValues args = new ContentValues();
args.put("KEY1", name);
args.put("KEY2", value1);
args.put("KEY3", value2);
args.put("KEY4", value3);
args.put("KEY5", value4);
db.update(TABLE_DETAILS, args, "id=" + rowId, null);
}
and use this wherever you want to update the row values.
db.updateRow(id, name, string1, string2, string3, string4);
回答3:
Your Function editChild
is perfectly OK.
Now the Problem Can be from Cursor Side. or regarding Database open or close.
回答4:
You need to use database.update(TABLE_CHILDREN, args, "id =?",new String{String.valueOf(id)});
来源:https://stackoverflow.com/questions/10011122/android-sqlite-update-row