2015-01-23 4 views
0

3 개의 테이블을 가진 데이터베이스를 생성하고 하나의 테이블에 데이터를 삽입하려고합니다.안드로이드 오류가있는 sqlite 데이터베이스

데이터베이스와 테이블이 완벽하게 잘 작성되고 있지만 한 테이블에 데이터를 삽입 할 수 없습니다.

DbOperations.java

package com.example.word_a_diction; 
import com.example.word_a_diction.TableData.TableInfo; 
import android.content.Context; 
import android.database.sqlite.SQLiteDatabase; 
import android.database.sqlite.SQLiteDatabase.CursorFactory; 
import android.database.sqlite.SQLiteOpenHelper; 
import android.util.Log; 

public class DbOperations extends SQLiteOpenHelper { 

    public static final int Db_Version = 1; 
    SQLiteDatabase sqldb; 

    public DbOperations(Context context) { 

     super(context, TableInfo.Db_Name, null, Db_Version); 
     System.out.println("Db Operations----Db Created"); 
    } 
    @Override 
    public void onCreate(SQLiteDatabase sdb) { 
      sdb.execSQL("CREATE TABLE "+TableInfo.Table1+ 
      " ("+TableInfo.S_no+" INTEGER PRIMARY KEY 
      AUTOINCREMENT ,"+TableInfo.Word+" TEXT UNIQUE ," 
      +TableInfo.Ans+" TEXT , "+TableInfo.Opt1+" TEXT ," 
      +TableInfo.Opt2+" TEXT ,"+TableInfo.Opt3+" TEXT ," 
      +TableInfo.Opt4+" TEXT ,"+TableInfo.M1+" TEXT ," 
      +TableInfo.M2+" TEXT ,"+TableInfo.M3+" TEXT ," 
      +TableInfo.M4+" TEXT);"); 
     System.out.println("db operations-----table1 created"); 
     sdb.execSQL("CREATE TABLE "+TableInfo.Table2+ 
     " ("+TableInfo.S_no+" INTEGER PRIMARY KEY AUTOINCREMENT,  "+TableInfo.Word+" TEXT ," 
      +TableInfo.Ans+" TEXT ,"+TableInfo.Opt1+" TEXT ," 
      +TableInfo.Opt2+" TEXT ,"+TableInfo.Opt3+" TEXT ," 
      +TableInfo.Opt4+" TEXT ,"+TableInfo.M1+" TEXT ," 
      +TableInfo.M2+" TEXT ,"+TableInfo.M3+" TEXT ," 
      +TableInfo.M4+" TEXT);"); 
    System.out.println("db operations-----table2 created"); 
    sdb.execSQL("CREATE TABLE "+TableInfo.Table3+ 
      " ("+TableInfo.S_no+" INTEGER PRIMARY KEY AUTOINCREMENT , "+TableInfo.Word+" TEXT ," 
      +TableInfo.Ans+" TEXT ,"+TableInfo.Opt1+" TEXT ," 
      +TableInfo.Opt2+" TEXT ,"+TableInfo.Opt3+" TEXT ," 
      +TableInfo.Opt4+" TEXT ,"+TableInfo.M1+" TEXT ," 
      +TableInfo.M2+" TEXT ,"+TableInfo.M3+" TEXT ," 
      +TableInfo.M4+" TEXT);"); 
    System.out.println("db operations---table3 created"); 

    insertValues(); 
} 

@Override 
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 

    db.execSQL("DROP TABLE IF EXISTS "+TableInfo.Table1+";"); 
    db.execSQL("DROP TABLE IF EXISTS "+TableInfo.Table2+";"); 
    db.execSQL("DROP TABLE IF EXISTS "+TableInfo.Table3+";"); 
    onCreate(db); 

} 

public void insertValues() 
{ 
    //open(); 
    //sqldb = this.getWritableDatabase(); 
    sqldb.execSQL("INSERT INTO BASIC VALUES ('Debonair','Sophisticated,charming','Careful'," + 
      "'Well-read','Sly','Sophisticated,charming','Using care','Knowledgeable'," + 
      "'Clever in a dishonest way,Cunning'," + 
      "'Having a refined knowledge of the ways of the world');"); 
    System.out.println("data inserted"); 

} 
public DbOperations open() { 
    sqldb = this.getWritableDatabase(); 
    return this; 
} 
public void close(){ 
    sqldb.close(); 
} 
} 

TableData.java

package com.example.word_a_diction; 
import android.provider.BaseColumns; 
public class TableData { 

public TableData() 
{ 

} 

public static abstract class TableInfo implements BaseColumns 
{ 
    public static final String S_no = "SNo"; 
    public static final String Word = "Word"; 
    public static final String Ans = "Ans"; 
    public static final String Opt1 = "Opt1"; 
    public static final String Opt2 = "Opt2"; 
    public static final String Opt3 = "Opt3"; 
    public static final String Opt4 = "Opt4"; 
    public static final String M1 = "M1"; 
    public static final String M2 = "M2"; 
    public static final String M3 = "M3"; 
    public static final String M4 = "M4"; 
    public static final String Db_Name = "ListOfWords"; 
    public static final String Table1 = "BASIC"; 
    public static final String Table2 = "INTER"; 
    public static final String Table3 = "SKILLED"; 
    } 
} 

QSkilled.java

package com.example.word_a_diction; 
    import android.app.Activity; 
    import android.content.Intent; 
    import android.os.Bundle; 
    import android.speech.tts.TextToSpeech; 
    import android.speech.tts.TextToSpeech.OnInitListener; 
    import android.view.View; 
    import android.view.View.OnClickListener; 
    import android.widget.ImageButton; 
    import android.widget.RadioButton; 
    import android.widget.TextView; 
    import android.widget.Toast; 

    public class QSkilled extends Activity 
    { 
     private DbOperations db1; 
     public void onCreate(Bundle b) 
     { 
      super.onCreate(b); 
      setContentView(R.layout.q_skilled); 
      db1 = new DbOperations(this); 
      db1.open(); 
     } 
     public void onDestroy(){ 
      db1.close(); 
     } 
} 

내가 계속 로그에 다음 오류가 표시됩니다. QSkilled.java을 열려고하면 애플리케이션이 강제로 닫힙니다.

01-23 09:41:37.875: I/System.out(330): Db Operations----Db Created 

01-23 09:41:37.984: I/System.out(330): db operations-----table1 created 

01-23 09:41:37.984: I/System.out(330): db operations-----table2 created 

01-23 09:41:37.994: I/System.out(330): db operations---table3 created 

01-23 09:41:38.048: D/AndroidRuntime(330): Shutting down VM 

01-23 09:41:38.054: W/dalvikvm(330): threadid=1: thread exiting with uncaught exception (group=0x40015560) 

01-23 09:41:38.076: E/AndroidRuntime(330): FATAL EXCEPTION: main 

01-23 09:41:38.076: E/AndroidRuntime(330): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.word_a_diction/com.example.word_a_diction.QSkilled}: java.lang.NullPointerException 

01-23 09:41:38.076: E/AndroidRuntime(330): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1647) 

01-23 09:41:38.076: E/AndroidRuntime(330): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663) 

01-23 09:41:38.076: E/AndroidRuntime(330): at android.app.ActivityThread.access$1500(ActivityThread.java:117) 

01-23 09:41:38.076: E/AndroidRuntime(330): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:931) 

01-23 09:41:38.076: E/AndroidRuntime(330): at android.os.Handler.dispatchMessage(Handler.java:99) 

01-23 09:41:38.076: E/AndroidRuntime(330): at android.os.Looper.loop(Looper.java:123) 

01-23 09:41:38.076: E/AndroidRuntime(330): at android.app.ActivityThread.main(ActivityThread.java:3683) 

01-23 09:41:38.076: E/AndroidRuntime(330): at java.lang.reflect.Method.invokeNative(Native Method) 

01-23 09:41:38.076: E/AndroidRuntime(330): at java.lang.reflect.Method.invoke(Method.java:507) 

01-23 09:41:38.076: E/AndroidRuntime(330): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) 

01-23 09:41:38.076: E/AndroidRuntime(330): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) 

01-23 09:41:38.076: E/AndroidRuntime(330): at dalvik.system.NativeStart.main(Native Method) 

01-23 09:41:38.076: E/AndroidRuntime(330): Caused by: java.lang.NullPointerException 

01-23 09:41:38.076: E/AndroidRuntime(330): at com.example.word_a_diction.DbOperations.insertValues(DbOperations.java:72) 

01-23 09:41:38.076: E/AndroidRuntime(330): at com.example.word_a_diction.DbOperations.onCreate(DbOperations.java:55) 

01-23 09:41:38.076: E/AndroidRuntime(330): at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:126) 

01-23 09:41:38.076: E/AndroidRuntime(330): at com.example.word_a_diction.DbOperations.open(DbOperations.java:80) 

01-23 09:41:38.076: E/AndroidRuntime(330): at com.example.word_a_diction.QSkilled.onCreate(QSkilled.java:102) 

01-23 09:41:38.076: E/AndroidRuntime(330): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) 

01-23 09:41:38.076: E/AndroidRuntime(330): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1611) 

01-23 09:41:38.076: E/AndroidRuntime(330): ... 11 more 

01-23 09:41:42.975: I/Process(330): Sending signal. PID: 330 SIG: 9 
+1

왜 'sqldb = this.getWritableDatabase();'행이'insertValues' 메소드에 주석 처리 되었습니까? –

+0

그 코드에서 해당 줄을 유지하면 "getWritableDatabase() recursively"라는 로그에 오류가 발생합니다. –

+1

insertValues ​​메서드 인 –

답변

0

insertValues()sqldb은 null입니다.

onCreate()에서 insertValues()으로 전화하기를 원하므로 초기화 할 수 없습니다. 대신 SQLiteDatabase을 매개 변수로 전달하고 메소드를 호출하십시오 (예 :

public void insertValues(SQLiteDatabase sqldb) 
+0

DbOperations.java 파일을 다음과 같이 변경했는데 이제는 "Db created"msg 로그 만 얻었습니다. 다른 것은없고 페이지가 완벽하게 열립니다 .. 그러나 생성 된 테이블과 데이터가 기록 된 로그를 볼 수는 없습니다 .. 그렇다면 테이블이 생성되었는지 아닌지 어떻게 알 수 있습니까? .. –

+0

'public void insertValues ​​()'를'public void insertValues ​​(SQLiteDatabase sdb) '그리고'sqldb.execSQL (..)'명령문을'sdb .execSQL (..)'및'insertValues ​​()'에서'insertValues ​​(sdb)' –

관련 문제