2014-09-15 2 views
1

onCreate()에서 addRow()를 통해 행을 추가하고 싶지만 작동하지 않는 것 같습니다. DatabaseManager.java 외부에서 작업 할 때 제대로 작동합니다. 나는 이것을 통해 다른 기능을 수행하고 이것을 시도했다. 접두어는 작동하지만 작동하지 않습니다. 데이터베이스를 만들 때 한 번만 행을 추가하려고합니다. java.lang.IllegalStateException :에 의해onCreate() 함수에 행 추가하기

09-15 08:39:32.780: D/dalvikvm(858): GC_FOR_ALLOC freed 47K, 5% free 2945K/3072K, paused 118ms, total 119ms 
09-15 08:39:32.780: I/dalvikvm-heap(858): Grow heap (frag case) to 3.554MB for 635812-byte allocation 
09-15 08:39:32.940: D/dalvikvm(858): GC_FOR_ALLOC freed 2K, 4% free 3563K/3696K, paused 151ms, total 152ms 
09-15 08:39:33.310: W/Settings(858): Setting airplane_mode_on has moved from android.provider.Settings.System to android.provider.Settings.Global, returning read-only value. 
09-15 08:39:33.620: D/AndroidRuntime(858): Shutting down VM 
09-15 08:39:33.620: W/dalvikvm(858): threadid=1: thread exiting with uncaught exception (group=0xb3ac6ba8) 
09-15 08:39:33.690: E/AndroidRuntime(858): FATAL EXCEPTION: main 
09-15 08:39:33.690: E/AndroidRuntime(858): Process: com.example.kontaktysqllite, PID: 858 
09-15 08:39:33.690: E/AndroidRuntime(858): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.kontaktysqllite/com.example.sqllite.MainActivity}: java.lang.IllegalStateException: getDatabase called recursively 
09-15 08:39:33.690: E/AndroidRuntime(858): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2195) 
09-15 08:39:33.690: E/AndroidRuntime(858): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2245) 
09-15 08:39:33.690: E/AndroidRuntime(858): at android.app.ActivityThread.access$800(ActivityThread.java:135) 
09-15 08:39:33.690: E/AndroidRuntime(858): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196) 
09-15 08:39:33.690: E/AndroidRuntime(858): at android.os.Handler.dispatchMessage(Handler.java:102) 
09-15 08:39:33.690: E/AndroidRuntime(858): at android.os.Looper.loop(Looper.java:136) 
09-15 08:39:33.690: E/AndroidRuntime(858): at android.app.ActivityThread.main(ActivityThread.java:5017) 
09-15 08:39:33.690: E/AndroidRuntime(858): at java.lang.reflect.Method.invokeNative(Native Method) 
09-15 08:39:33.690: E/AndroidRuntime(858): at java.lang.reflect.Method.invoke(Method.java:515) 
09-15 08:39:33.690: E/AndroidRuntime(858): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779) 
09-15 08:39:33.690: E/AndroidRuntime(858): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595) 
09-15 08:39:33.690: E/AndroidRuntime(858): at dalvik.system.NativeStart.main(Native Method) 
09-15 08:39:33.690: E/AndroidRuntime(858): Caused by: java.lang.IllegalStateException: getDatabase called recursively 
09-15 08:39:33.690: E/AndroidRuntime(858): at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:204) 
09-15 08:39:33.690: E/AndroidRuntime(858): at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:164) 
09-15 08:39:33.690: E/AndroidRuntime(858): at com.example.sqllite.DatabaseManager.addRow(DatabaseManager.java:61) 
09-15 08:39:33.690: E/AndroidRuntime(858): at com.example.sqllite.DatabaseManager.onCreate(DatabaseManager.java:37) 
09-15 08:39:33.690: E/AndroidRuntime(858): at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:252) 
09-15 08:39:33.690: E/AndroidRuntime(858): at android.database.sqlite.SQLiteOpenHelper.getReadableDatabase(SQLiteOpenHelper.java:188) 
09-15 08:39:33.690: E/AndroidRuntime(858): at com.example.sqllite.DatabaseManager.getAll(DatabaseManager.java:76) 
09-15 08:39:33.690: E/AndroidRuntime(858): at com.example.sqllite.MainActivity.onCreate(MainActivity.java:70) 
09-15 08:39:33.690: E/AndroidRuntime(858): at android.app.Activity.performCreate(Activity.java:5231) 
09-15 08:39:33.690: E/AndroidRuntime(858): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087) 
09-15 08:39:33.690: E/AndroidRuntime(858): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2159) 
09-15 08:39:33.690: E/AndroidRuntime(858): ... 11 more 
09-15 08:39:41.490: I/Process(858): Sending signal. PID: 858 SIG: 9 
+0

'에 의한 getDatabase 그래 내가 알고 @SagarPilkhwal –

+0

recursively'라고하지만 그 문제를 일으키는? – Volz

답변

1

를 일으켰 :

내 DatabaseManager.java

package com.example.sqllite; 

import android.content.ContentValues; 
import android.content.Context; 
import android.database.Cursor; 
import android.database.sqlite.SQLiteDatabase; 
import android.database.sqlite.SQLiteOpenHelper; 

/** 
* Class to manage database 
* 
* @author Karol 
* 
*/ 
public class DatabaseManager extends SQLiteOpenHelper { 

    /** 
    * Constructor 
    * 
    * @param context 
    */ 
    public DatabaseManager(Context context) { 
     super(context, "kontakty.db", null, 1); 
    } 

    /** 
    * Override onCreate function 
    * 
    * Creates table with columns: [id][link][name][thumbail] 
    */ 
    @Override 
    public void onCreate(SQLiteDatabase db) { 
     db.execSQL("create table templates(" 
       + "id integer primary key autoincrement," + "link text," 
       + "name text," + "thumbail text);" + ""); 

     addRow(
       "link", 
       "name", 
       "thumbail"); 
    } 

    /** 
    * Overrides onUpgrade method 
    */ 
    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
    } 

    /** 
    * Add row to database 
    * 
    * @param link 
    *   URL to template 
    * @param name 
    *   Name of template 
    * @param thumbail 
    *   Url to templates thumbail 
    */ 
    public void addRow(String link, String name, String thumbail) { 
     SQLiteDatabase db = getWritableDatabase(); 
     ContentValues values = new ContentValues(); 
     values.put("link", link); 
     values.put("name", name); 
     values.put("thumbail", thumbail); 
     db.insertOrThrow("templates", null, values); 
    } 

    /** 
    * Returns cursor (rows) for all rows in database 
    * 
    * @return Cursor which contains all rows 
    */ 
    public Cursor getAll() { 
     String[] columns = { "id", "link", "name", "thumbail" }; 
     SQLiteDatabase db = getReadableDatabase(); 
     Cursor c = db.query("templates", columns, null, null, null, null, null); 
     return c; 
    } 

} 

HRE 내 로그 캣입니다

을 : getDatabase이 시도 재귀

라고

private SQLiteDatabase db; 

public void addRow(String link, String name, String thumbail) { 
     if(db == null) 
     { 
      db = getWritableDatabase(); 
     } 
     ContentValues values = new ContentValues(); 
     values.put("link", link); 
     values.put("name", name); 
     values.put("thumbail", thumbail); 
     db.insertOrThrow("templates", null, values); 
    } 

또는

당신은 addRow()에 매개 변수로 onCreate()에서 db 개체를 전달하고 제거 SQLiteDatabase db = getWritableDatabase(); 당신의 addRow()

1

으로 이동에게 db 당신의 onCreate()에서 addRow()에 매개 변수로 거기 getWritableDatabase()을 제거 할 수 있습니다.

을 유발 한 getWritableDatabase() 또는 getReadableDatabase()에 대한 이전 호출 내에서도 getWritableDatabase()으로 전화를 걸 수 없습니다.

0

이유는 getWritableDatabase 실제로 이러한 코드가 포함되어 있습니다 :

if (version == 0) { 
    onCreate(db); 
... 
} 

와의

당신의 onCreate 당신이 onCreate를 호출하고이 루프가 완료되지 않을 것이다 getWritableDatabase를 호출하고 있습니다.

+0

그래서'onCreate' 외부에 행을 추가하는 방법을 찾아야하지만 여전히 한 번만 할 수 있습니다. – Volz

+0

@laalto는'onCreate'에서'addRows' 메쏘드로'db'를 전달하고 거기서'getWritableDatabase'를 제거하도록 조언했습니다. – cliffroot

1

이것은 당신의 코드입니다 : java.lang.IllegalStateException :

package com.example.sqllite; 

import android.content.ContentValues; 
import android.content.Context; 
import android.database.Cursor; 
import android.database.sqlite.SQLiteDatabase; 
import android.database.sqlite.SQLiteOpenHelper; 

/** 
* Class to manage database 
* 
* @author Karol 
* 
*/ 
public class DatabaseManager extends SQLiteOpenHelper { 

    private SQLiteDatabase db; 

    /** 
    * Constructor 
    * 
    * @param context 
    */ 
    public DatabaseManager(Context context) { 
      super(context, "kontakty.db", null, 1); 
    } 

    /** 
    * Override onCreate function 
    * 
    * Creates table with columns: [id][link][name][thumbail] 
    */ 
    @Override 
    public void onCreate(SQLiteDatabase db) { 
      db.execSQL("create table templates(" 
          + "id integer primary key autoincrement," + "link text," 
          + "name text," + "thumbail text);" + ""); 

      // Avoiding Caused by: java.lang.IllegalStateException: getDatabase called recursively 
      setDbOnCreate(db); 

      addRow(
          "link", 
        "name", 
        "thumbail"); 
    } 

    /** 
    * Overrides onUpgrade method 
    */ 
    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
    } 

    /** 
    * Add row to database 
    * 
    * @param link 
    *   URL to template 
    * @param name 
    *   Name of template 
    * @param thumbail 
    *   Url to templates thumbail 
    */ 
    public void addRow(String link, String name, String thumbail) { 
    if(db == null) 
    { 
     db = getWritableDatabase(); 
    } 
    ContentValues values = new ContentValues(); 
    values.put("link", link); 
    values.put("name", name); 
    values.put("thumbail", thumbail); 
    db.insertOrThrow("templates", null, values); 
    } 

    /** 
    * Set private variable to parameter 
    * @param db 
    */ 
    private void setDbOnCreate(SQLiteDatabase db) { 
      this.db = db; 
    } 

    /** 
    * Returns cursor (rows) for all rows in database 
    * 
    * @return Cursor which contains all rows 
    */ 
    public Cursor getAll() { 
      String[] columns = { "id", "link", "name", "thumbail" }; 
      SQLiteDatabase db = getReadableDatabase(); 
      Cursor c = db.query("templates", columns, null, null, null, null, null); 
      return c; 
    } 

} 
+0

잘 작동합니다. 고맙습니다. – Volz

+0

내 대답을 복사했습니다 : P –

+0

매개 변수 전달에 멤버 변수를 사용하면 이국적이며 나중에 모든 종류의 버그가 발생할 수 있습니다. 예를 들어,'onCreate()'외부에서'addRow() '를 호출하면 전혀 작동하지 않습니다. – laalto