Android sqlite 更新行
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/10011122/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Android sqlite update row
提问by Worker123
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:
现在我看到 logcat,抛出这些异常:
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:
DatabaseHelper 类:
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"));
}
}
采纳答案by Barak
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.
1) 您需要关闭光标。就个人而言,我让框架通过使用startManagingCursor(mYourCursor);
来处理这个问题,而不必尝试并记住自己做。
2) Android expects your row id to be "_id", so you might try changing all your tables to use that.
2) Android 期望您的行 ID 为“_id”,因此您可以尝试更改所有表以使用它。
回答by wolverine
Try this code:
试试这个代码:
This is in your DatabaseHelper class,
这是在您的 DatabaseHelper 类中,
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);
回答by Bhavin
Your Function editChild
is perfectly OK.
你的功能editChild
完全没问题。
Now the Problem Can be from Cursor Side. or regarding Database open or close.
现在问题可以来自光标端。或关于数据库打开或关闭。
回答by omkar.ghaisas
You need to use database.update(TABLE_CHILDREN, args, "id =?",new String{String.valueOf(id)});
您需要使用 database.update(TABLE_CHILDREN, args, "id =?",new String{String.valueOf(id)});