Android sqlite update row

二次信任 提交于 2019-12-09 19:02:41

问题


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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!