2017-04-13 17 views
-3

데이터베이스에서 데이터를 가져 오려고하는데 앱을 접을 때 앱이 접습니다.데이터베이스에서 모든 항목을 가져 오려고하면 앱이 붕괴합니다.

내 코드를 확인하고 도움을 요청하십시오. 문제를 해결할 수는 있지만 문제가 무엇인지 찾을 수 없습니다. 나는 (이 기능을 실행하려고하면

공용 클래스 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; 
} 

를 확장 :

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... 

이 내 데이터베이스입니다 : 내가 저장하려고 무엇

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... 

문제는 내가 뭔가를 쓸 때입니다 같은 -

목록 = myPetsOpenHelper.getAll();

앱이 무너졌습니다!

저에게 도와주세요

전체 추적 :

04-14 15 : 46 : 49.913 11231-11231가/com.example.admin.petcare I/데이터 : 목록 크기가 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 = 작업 1 task2 = 작업 2 task3 = 작업 3 이름 = 예 android.databa se.sqlite.SQLiteException : 테이블 tblmypets에는 task2 (코드 1)라는 열이 없습니다. 컴파일시 : INSERT INTO tblmypets (image, task1, task2, task3, name) VALUES (?,?,?,?,?) at android.database.sqlite.SQLiteConnection.nativePrepareStatement (네이티브 메소드) and35.pdf (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) at com.example.admin.petcare.MyPetsOpenHelper.createSinglePet (MyPetsOpenHelper.java) : 74) at com.example.admin.petcare.MyPetsActivity.examplePet (MyPetsActivity.java:182) at com.example.admin.petcare.MyPetsActivity.onCreate (MyPetsActivity.java:68) android.app.Activity android.app.ActivityThread.performLaunchActivity (ActivityThread.java:2175)에서 android.app.Instrumentation.callActivityOnCreate (Instrumentation.java:1087) 에서 .performCreate (Activity.java:5133) ,536,913,632 10 android.app.ActivityThread.android.os.Handler에서 android.app.ActivityThread $ H.handleMessage (ActivityThread.java:1256) 에서 android.app.ActivityThread.access $ 600 (ActivityThread.java:141) 에서 handleLaunchActivity (ActivityThread.java:2261) java.lang.reflect.Method에에서 android.app.ActivityThread.main (ActivityThread.java:5103) 에서 android.os.Looper.loop (Looper.java:137) 에서 .dispatchMessage (Handler.java:99) COM에서 com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:737) 에서 java.lang.reflect.Method.invoke (Method.java:525) 에서 .invokeNative (기본 방법) .android.internal.os.ZygoteInit.main (ZygoteInit.java:553) at 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) 해당 열 없음 : task2 04-14 15 : 46 : 49.993 11231-11231/com.example.admin.petcare D/AndroidRuntime : VM 종료 중 04-14 (그룹 = 0xa4fdc678) 04-14 15 : 46 : 50.003 11231-11231/com.example .admin.petcare E/AndroidRuntime : 치명적인 예외 : 주 java.lang.RuntimeException : 활동을 시작할 수 없습니다. ComponentInfo {com.example.admin.petcare/com.example.admin.petcare.MyPetsActivity} : android.database.sqlite.SQLiteException : 해당 열이 없습니다. task2 (code 1) :, 컴파일하는 동안 : android.app.ActivityThread.handleLaunchActivity (ActivityThread.java:2261)에서 android.app.ActivityThread.performLaunchActivity (ActivityThread.java:2211)에서 tblmypets FROM SELECT ID, 이름, 이미지, 작업 1, task2, task3 을 android.app.ActivityThread.access $ 600 (ActivityThread.java:141) android.app.ActivityThread $ H.handleMessage (ActivityThread.java:1256) at android.os.Handler.dispatchMessage (Handler.java:99) android.os.Looper.loop (Looper.java:137)의 android.app.ActivityThread.main (ActivityThread.java:5103) at java.lang.reflect.Method.invokeNative (네이티브 메소드) at java.lang.reflect.Method.invoke (Method.java:525) com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:737) at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:553) at 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. 쿼리 (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:1032)에서 at com. example.admin.petcare.MyPetsOpenHelper.getAll (MyPetsOpenHelper.java:83) at com.example.admin.petcare.MyPetsActivity.onCreate (MyPetsActivity.java:72) android.app.Activity.performCreate (Activity.java : 5133) android.app.Instrumentation.callActivityOnCreate (Instrumentation.java:1087) at android.app.ActivityThread.performLaunchActivity (ActivityThread.java:2175) android.app에 있습니다. android.os에서 android.app.ActivityThread $ H.handleMessage (ActivityThread.java:1256) 에서 android.app.ActivityThread.access $ 600 (ActivityThread.java:141) 에서 ActivityThread.handleLaunchActivity (ActivityThread.java:2261) .Handler.dispatchMessage (Handler.java:99) android.os.Looper.loop (Looper.java:137)의 android.app.ActivityThread.main (ActivityThread.java:5103)의 의 java.lang.reflect에서 .Method.invokeNative (네이티브 메소드) at java.lang.reflect.Method.invoke (Method.java:525) at com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:737) at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:553) at 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} - [email protected], 시작 60021ms 전에 04-14 15 : 48 : 19.403 14 60-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 (부가 기능)}

+0

콜 스택 작성 – Vyacheslav

+0

크래시 로그를 게시하십시오 –

+0

내 게시물을 편집했습니다. – Meow

답변

0

로그에 표시되는 오류의 원인을 찾을 수 없습니다 (코드는 괜찮아 보입니다). 그러나, 나는 당신의 코드를 테스트했고 약간의 수정을했다 (에러와 관련이 없다). 괜찮아. 차이점을 확인하고 그에 따라 코드를 수정하거나 아래 코드를 복사하면됩니다. 여기 내 코드는 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로 변경했습니다. 따라서 데이터를 다시 입력해야합니다. 희망이 도움이됩니다.

+0

아직 붕괴되었습니다 ... – Meow

+0

allright. 고맙습니다. – Meow

+0

불행히도 .. – Meow