【问题标题】:The app collapses when I try to get all the items from database [duplicate]当我尝试从数据库中获取所有项目时,应用程序崩溃 [重复]
【发布时间】:2017-09-09 13:07:45
【问题描述】:

我正在尝试从我的数据库中获取数据,但是当我这样做时应用程序崩溃了。

请检查我的代码并帮助我,我已尝试修复它但我找不到问题所在。

这就是我要保存的内容:

public class SinglePet {

private String name;
private Bitmap photo;
private String task1;
private String task2;
private String task3;

private long id;

public SinglePet(String name, Bitmap photo, String task1, String task2, String task3, long id) {
    this.name = name;
    this.photo = photo;
    this.task1 = task1;
    this.task2 = task2;
    this.task3 = task3;
    this.id = id;
}

 //and getter and setter...

这是我的数据库:

公共类 MyPetsOpenHelper 扩展 SQLiteOpenHelper {

public static final String DATABASENAME="pets.db";
public static final String TABLE_MYPETS="tblmypets";
public static final int DATABASEVERSION=1;

public static final String COLUMN_ID="id";
public static final String COLUMN_IMAGE="image";
public static final String COLUMN_NAME="name";
public static final String COLUMN_TASK1="task1";
public static final String COLUMN_TASK2="task2";
public static final String COLUMN_TASK3="task3";

private static final String CREATE_TABLE_MYPETS="CREATE TABLE IF NOT EXISTS " +
        TABLE_MYPETS + "(" + COLUMN_ID +  " INTEGER PRIMARY KEY AUTOINCREMENT," + COLUMN_NAME + " VARCHAR," + COLUMN_IMAGE + " BLOB,"
        + COLUMN_TASK1 + " VARCHAR," + COLUMN_TASK2 + " VARCHAR," + COLUMN_TASK3 + " VARCHAR"  +  ");";

String [] allColumns={MyPetsOpenHelper.COLUMN_ID, MyPetsOpenHelper.COLUMN_NAME, MyPetsOpenHelper.COLUMN_IMAGE,
        MyPetsOpenHelper.COLUMN_TASK1, MyPetsOpenHelper.COLUMN_TASK2, MyPetsOpenHelper.COLUMN_TASK3};

SQLiteDatabase database;

public MyPetsOpenHelper(Context context)
{
    super(context, DATABASENAME, null, DATABASEVERSION);
}

public void onCreate(SQLiteDatabase db) {
    db.execSQL(CREATE_TABLE_MYPETS);
    Log.d("data", "Table MyPets is created");
}

public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    db.execSQL("DROP TABLE IF EXISTS" + TABLE_MYPETS);
    onCreate(db);
}

public void open()
{
    database=this.getWritableDatabase();
    Log.d("data", "database connection open");
}

//QUERIES
public SinglePet createSinglePet(SinglePet s)
{
    ContentValues values= new ContentValues();
    values.put(COLUMN_NAME, s.getName());
    Bitmap b=s.getPhoto();
    values.put(COLUMN_IMAGE,PhotoHelper.bitmapToString(b));
    values.put(COLUMN_TASK1, s.getTask1());
    values.put(COLUMN_TASK2, s.getTask2());
    values.put(COLUMN_TASK3, s.getTask3());

    long insertId=database.insert(TABLE_MYPETS, null, values);
    Log.d("data", "MyPets " + insertId + " insert to database");
    s.setId(insertId);
    return s;
}

当我尝试运行此函数 (getAll()) 时,应用崩溃!!!

public ArrayList<SinglePet> getAll()
{
    ArrayList<SinglePet> l= new ArrayList<SinglePet>();
    Cursor cursor=database.query(MyPetsOpenHelper.TABLE_MYPETS, allColumns, null, null, null, null, null);
    if(cursor.getCount()>0)
    {
        while (cursor.moveToNext())
        {
            long id= cursor.getLong(cursor.getColumnIndex(MyPetsOpenHelper.COLUMN_ID));
            String name= cursor.getString(cursor.getColumnIndex(MyPetsOpenHelper.COLUMN_NAME));
            byte [] image= cursor.getBlob(cursor.getColumnIndex(MyPetsOpenHelper.COLUMN_IMAGE));
            Bitmap imageB= PhotoHelper.byteArrayTBitmap(image);
            String task1= cursor.getString(cursor.getColumnIndex(MyPetsOpenHelper.COLUMN_TASK1));
            String task2= cursor.getString(cursor.getColumnIndex(MyPetsOpenHelper.COLUMN_TASK2));
            String task3= cursor.getString(cursor.getColumnIndex(MyPetsOpenHelper.COLUMN_TASK3));

            SinglePet s=new SinglePet(name, imageB , task1, task2, task3, id);
            l.add(s);
        }
    }
    return  l;


// and the rest of the class doesn't matter...

问题是当我写类似 -

list=myPetsOpenHelper.getAll();

应用崩溃!!!

请帮帮我

完整的跟踪:

04-14 15:46:49.913 11231-11231/com.example.admin.petcare I/data:列表大小为 0 04-14 15:46:49.933 11231-11231/com.example.admin.petcare D/data: 数据库连接打开 04-14 15:46:49.983 11231-11231/com.example.admin.petcare E/SQLiteLog: (1) 表 tblmypets 没有名为 task2 的列 04-14 15:46:49.983 11231-11231/com.example.admin.petcare E/SQLiteDatabase: 插入图像时出错=[B@a5a2aa38 task1=task 1 task2=task 2 task3=task 3 name=example android.database.sqlite.SQLiteException: table tblmypets has no column named task2 (code 1): , while compile: INSERT INTO tblmypets(image,task1,task2,task3,name) VALUES (?,?,?,?,?) 在 android.database.sqlite.SQLiteConnection.nativePrepareStatement(本机方法) 在 android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:889) 在 android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:500) 在 android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:588) 在 android.database.sqlite.SQLiteProgram.(SQLiteProgram.java:58) 在 android.database.sqlite.SQLiteStatement.(SQLiteStatement.java:31) 在 android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:1467) 在 android.database.sqlite.SQLiteDatabase.insert(SQLiteDatabase.java:1339) 在 com.example.admin.petcare.MyPetsOpenHelper.createSinglePet(MyPetsOpenHelper.java:74) 在 com.example.admin.petcare.MyPetsActivity.examplePet(MyPetsActivity.java:182) 在 com.example.admin.petcare.MyPetsActivity.onCreate(MyPetsActivity.java:68) 在 android.app.Activity.performCreate(Activity.java:5133) 在 android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087) 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2175) 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2261) 在 android.app.ActivityThread.access$600(ActivityThread.java:141) 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1256) 在 android.os.Handler.dispatchMessage(Handler.java:99) 在 android.os.Looper.loop(Looper.java:137) 在 android.app.ActivityThread.main(ActivityThread.java:5103) 在 java.lang.reflect.Method.invokeNative(Native Method) 在 java.lang.reflect.Method.invoke(Method.java:525) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 在 dalvik.system.NativeStart.main(本机方法) 04-14 15:46:49.983 11231-11231/com.example.admin.petcare D/data: MyPets -1 插入数据库 04-14 15:46:49.993 11231-11231/com.example.admin.petcare D/data: 数据库连接打开 04-14 15:46:49.993 11231-11231/com.example.admin.petcare E/SQLiteLog: (1) no such column: task2 04-14 15:46:49.993 11231-11231/com.example.admin.petcare D/AndroidRuntime: 关闭虚拟机 04-14 15:46:49.993 11231-11231/com.example.admin.petcare W/dalvikvm: threadid=1: 线程退出未捕获异常 (group=0xa4fdc678) 04-14 15:46:50.003 11231-11231/com.example.admin.petcare E/AndroidRuntime: 致命异常: main java.lang.RuntimeException:无法启动活动 ComponentInfo{com.example.admin.petcare/com.example.admin.petcare.MyPetsActivity}:android.database.sqlite.SQLiteException:没有这样的列:task2(代码 1):,编译时:SELECT id, name, image, task1, task2, task3 FROM tblmypets 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2211) 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2261) 在 android.app.ActivityThread.access$600(ActivityThread.java:141) 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1256) 在 android.os.Handler.dispatchMessage(Handler.java:99) 在 android.os.Looper.loop(Looper.java:137) 在 android.app.ActivityThread.main(ActivityThread.java:5103) 在 java.lang.reflect.Method.invokeNative(Native Method) 在 java.lang.reflect.Method.invoke(Method.java:525) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 在 dalvik.system.NativeStart.main(本机方法) 引起:android.database.sqlite.SQLiteException:没有这样的列:task2(代码1):,编译时:SELECT id,name,image,task1,task2,task3 FROM tblmypets 在 android.database.sqlite.SQLiteConnection.nativePrepareStatement(本机方法) 在 android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:889) 在 android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:500) 在 android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:588) 在 android.database.sqlite.SQLiteProgram.(SQLiteProgram.java:58) 在 android.database.sqlite.SQLiteQuery.(SQLiteQuery.java:37) 在 android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:44) 在 android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1314) 在 android.database.sqlite.SQLiteDatabase.queryWithFactory(SQLiteDatabase.java:1161) 在 android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1032) 在 android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1200) 在 com.example.admin.petcare.MyPetsOpenHelper.getAll(MyPetsOpenHelper.java:83) 在 com.example.admin.petcare.MyPetsActivity.onCreate(MyPetsActivity.java:72) 在 android.app.Activity.performCreate(Activity.java:5133) 在 android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087) 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2175) 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2261) 在 android.app.ActivityThread.access$600(ActivityThread.java:141) 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1256) 在 android.os.Handler.dispatchMessage(Handler.java:99) 在 android.os.Looper.loop(Looper.java:137) 在 android.app.ActivityThread.main(ActivityThread.java:5103) 在 java.lang.reflect.Method.invokeNative(Native Method) 在 java.lang.reflect.Method.invoke(Method.java:525) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 在 dalvik.system.NativeStart.main(本机方法) 04-14 15:46:50.013 1460-1460/system_process W/ActivityManager:强制完成活动 com.example.admin.petcare/.MyPetsActivity 04-14 15:46:50.343 1974-11625/com.google.android.gms D/DropBoxEntryAddedChimeraService:用户未选择加入使用和诊断或密码箱。 04-14 15:46:50.523 1460-1477/system_process W/ActivityManager:ActivityRecord{a5642da0 u0 com.example.admin.petcare/.MyPetsActivity} 的活动暂停超时 04-14 15:46:59.723 1460-1477/system_process W/ActivityManager:启动超时已过期,放弃唤醒锁! 04-14 15:46:59.743 1460-1477/system_process W/ActivityManager:ActivityRecord{a5642da0 u0 com.example.admin.petcare/.MyPetsActivity} 的活动空闲超时 04-14 15:47:00.533 1460-1477/system_process W/ActivityManager:ActivityRecord{a54c27e0 u0 com.example.admin.petcare/.MainActivity} 的活动空闲超时 04-14 15:47:04.733 1460-1477/system_process W/ProcessStats:跳过未知进程 pid 11730 04-14 15:47:09.753 1460-1477/system_process W/ActivityManager:ActivityRecord{a5642da0 u0 com.example.admin.petcare/.MyPetsActivity} 的活动销毁超时 04-14 15:48:19.403 1460-1477/system_process W/BroadcastQueue:广播 BroadcastRecord{a572c658 u0 com.google.firebase.INSTANCE_ID_EVENT} -receiver=android.os.BinderProxy@a5d035d0,在 60021 毫秒前开始 04-14 15:48:19.403 1460-1477/system_process W/BroadcastQueue:超时期间的接收器:ResolveInfo{a572cb00 com.google.firebase.iid.FirebaseInstanceIdInternalReceiver p=0 o=0 m=0x0} 04-14 15:48:19.433 1460-1477/system_process I/ActivityManager: 跳过应用程序崩溃 ANR: ProcessRecord{a5637df0 11231:com.example.admin.petcare/u0a10050} 广播意图 { act=com.google.firebase.INSTANCE_ID_EVENT flg=0x14 cmp=com.example.admin.petcare/com.google.firebase.iid.FirebaseInstanceIdInternalReceiver(有附加功能)}

【问题讨论】:

  • 编写你的调用栈
  • 请发布您的崩溃日志
  • 做到了(我编辑了我的帖子)

标签: android sqlite android-sqlite blob android-database


【解决方案1】:

我无法找到您的日志中显示的错误原因(您的代码看起来不错)。不过,我已经测试了您的代码并进行了一些修改(与错误无关)。它工作正常。您可以检查差异并相应地修改您自己的代码,或者只需复制以下代码。这是我的MyPetsOpenHelper.java 代码。 (您提供的部分)。

public class MyPetsOpenHelper extends SQLiteOpenHelper {

    public static final String DATABASENAME = "pets.db";
    public static final String TABLE_MYPETS = "tblmypets";
    public static final int DATABASEVERSION = 2;

    public static final String COLUMN_ID = "id";
    public static final String COLUMN_IMAGE = "image";
    public static final String COLUMN_NAME = "name";
    public static final String COLUMN_TASK1 = "task1";
    public static final String COLUMN_TASK2 = "task2";
    public static final String COLUMN_TASK3 = "task3";

    private static final String CREATE_TABLE_MYPETS = "CREATE TABLE IF NOT EXISTS " +
            TABLE_MYPETS + "(" + COLUMN_ID + " INTEGER PRIMARY KEY AUTOINCREMENT," + COLUMN_NAME + " VARCHAR," + COLUMN_IMAGE + " BLOB,"
            + COLUMN_TASK1 + " VARCHAR," + COLUMN_TASK2 + " VARCHAR," + COLUMN_TASK3 + " VARCHAR" + ");";

    String[] allColumns = {MyPetsOpenHelper.COLUMN_ID, MyPetsOpenHelper.COLUMN_NAME,  MyPetsOpenHelper.COLUMN_IMAGE,
            MyPetsOpenHelper.COLUMN_TASK1, MyPetsOpenHelper.COLUMN_TASK2, MyPetsOpenHelper.COLUMN_TASK3};

    SQLiteDatabase database;

    public MyPetsOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
        super(context, DATABASENAME, factory, DATABASEVERSION);
    }

    public void onCreate(SQLiteDatabase db) {
        db.execSQL(CREATE_TABLE_MYPETS);
        Log.d("data", "Table MyPets is created");
    }

    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        db.execSQL("DROP TABLE IF EXISTS" + TABLE_MYPETS);
        onCreate(db);
    }

    public void open() {
        database = this.getWritableDatabase();
        Log.d("data", "database connection open");
    }

    public void close() {
        database.close();
        Log.d("data", "database connection closed");
    }

    //QUERIES
    public SinglePet createSinglePet(SinglePet s) {
        ContentValues values = new ContentValues();
        open();
        values.put(COLUMN_NAME, s.getName());
          Bitmap b = s.getPhoto();
          values.put(COLUMN_IMAGE, PhotoHelper.bitmapToString(b));
        values.put(COLUMN_TASK1, s.getTask1());
        values.put(COLUMN_TASK2, s.getTask2());
        values.put(COLUMN_TASK3, s.getTask3());

        long insertId = database.insert(TABLE_MYPETS, null, values);
        Log.d("data", "MyPets " + insertId + " insert to database");
        s.setId(insertId);
        close();
        return s;
    }

    public ArrayList<SinglePet> getAll() {
        ArrayList<SinglePet> l = new ArrayList<SinglePet>();
        open();
        Cursor cursor = database.query(MyPetsOpenHelper.TABLE_MYPETS, allColumns, null, null, null, null, null);
        if (cursor != null) {
            cursor.moveToFirst();
            while (!cursor.isAfterLast()) {
                long id = cursor.getLong(cursor.getColumnIndex(MyPetsOpenHelper.COLUMN_ID));
                String name = cursor.getString(cursor.getColumnIndex(MyPetsOpenHelper.COLUMN_NAME));
                byte [] image= cursor.getBlob(cursor.getColumnIndex(MyPetsOpenHelper.COLUMN_IMAGE));
                Bitmap imageB= PhotoHelper.byteArrayTBitmap(image);
                String task1 = cursor.getString(cursor.getColumnIndex(MyPetsOpenHelper.COLUMN_TASK1));
                String task2 = cursor.getString(cursor.getColumnIndex(MyPetsOpenHelper.COLUMN_TASK2));
                String task3 = cursor.getString(cursor.getColumnIndex(MyPetsOpenHelper.COLUMN_TASK3));

                SinglePet s = new SinglePet(name, task1, task2, task3, id);
                l.add(s);
                cursor.moveToNext();
            }
            cursor.close();
            close();
        }
        return l;

    }
}

注意:我已将DATABASEVERSION 更改为2。它将重新创建数据库,因此您以前的表和数据将被删除。所以你必须重新输入你的数据。希望这会有所帮助。

【讨论】:

  • 它仍然崩溃..
  • 好的。谢谢
  • 很遗憾没有..
  • 我已将版本更改为 2 和 getAll() 函数。然后当我只打开数据库时应用程序崩溃了。所以我将版本改回 1 - 但它仍然崩溃
  • 我认为保存图片的方法是这样的。
猜你喜欢
  • 2017-05-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-11
  • 1970-01-01
  • 2022-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多