2015-05-08 3 views
1

Я пытаюсь вставить и извлечь данные из базы данных в eclipse с помощью sqlite, но он показывает RuntimeError. Я создаю макет с тремя текстами редактирования и одной кнопкой для создания простой информации, но ничего не создается. Я создаю Java базы данных с помощью следующего кода:RuntimeError при извлечении данных из базы данных sqlite в android

package com.example.databasetest; 



import android.content.ContentValues; 
import android.content.Context; 
import android.database.SQLException; 
import android.database.sqlite.SQLiteDatabase; 
import android.database.sqlite.SQLiteOpenHelper; 
import android.util.Log; 

public class DBHelper extends SQLiteOpenHelper{ 

    private static final int DATABASE_VERSION = 1; 
    private static final String DATABASE_NAME = "teacher"; 
    private static final String TABLE_NAME = "teacher_table"; 

    private static final String NAME = "teacher_name"; 
    private static final String FATHER_NAME = "father_name"; 
    private static final String MOTHER_NAME = "mother_name"; 

    SQLiteDatabase data=this.getWritableDatabase(); 

    Context ctx; 



    public DBHelper(Context context) { 
     super(context, DATABASE_NAME, null, DATABASE_VERSION); 
     ctx=context; 
     Log.d("DATABASE OPERATION", "DATABASE CREATED"); 
    } 

    @Override 
    public void onCreate(SQLiteDatabase db) { 
     data=db; 
     db.execSQL("CREATE TABLE " + TABLE_NAME + " (" 
       + NAME + " TEXT," 
       + FATHER_NAME + " TEXT," 
       + MOTHER_NAME + " INTEGER," 
       + ");"); 
     Log.d("DATABASE OPERATION", "TABLE CREATED"); 


    } 
    public void open() throws SQLException 
    { 
     DBHelper db1 = new DBHelper(ctx); 
      data = db1.getWritableDatabase(); 
    } 

    public void close() 
    { 
     data.close(); 
    } 
    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
     db.execSQL("DROP TABLE IF EXCEPTION EXISTS"); 
     onCreate(db);  
    } 
    public void onInsert(DBHelper db,String name,String f_name, String m_name) 
    { 
     SQLiteDatabase sql= db.getWritableDatabase(); 
     ContentValues cv=new ContentValues(); 
     cv.put("teacher_name",name); 
     cv.put("father_name", f_name); 
     cv.put("mother_name", m_name); 
     sql.insert(TABLE_NAME, null, cv); 
     Log.d("DATABASE OPERATION", "ONE ROW INSERTED....."); 
    } 

} 

И ява файл, как ...

package com.example.databasetest; 


import android.app.Activity; 
import android.content.Context; 
import android.os.Bundle; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Button; 
import android.widget.EditText; 
import android.widget.Toast; 


public class MainActivity extends Activity { 

    EditText NAME,FATHER,MOTHER,ID; 
    String name,father,mother,id; 
    int i=1; 
    Button save; 
    Context ctxx; 


    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     NAME=(EditText)findViewById(R.id.name); 
     FATHER=(EditText)findViewById(R.id.father_name); 
     MOTHER=(EditText)findViewById(R.id.mother_name); 
     ID=(EditText)findViewById(R.id.emp_id); 


     save=(Button)findViewById(R.id.submit); 
     save.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       id=ID.getText().toString(); 
       name=NAME.getText().toString(); 
       father=FATHER.getText().toString(); 
       mother=MOTHER.getText().toString(); 

       if(id.equals(i)) 
       { 
        Toast.makeText(getBaseContext(), "not allow insertion", Toast.LENGTH_LONG).show(); 
       } 
       else 
       { 
       DBHelper DB=new DBHelper(ctxx); 
       DB.open(); 
       DB.onInsert(DB, name, father, mother); 
       Toast.makeText(getBaseContext(), "insertion sucessful", Toast.LENGTH_LONG).show(); 
       finish(); 
       } 
      } 
     }); 


    } 
} 

и его шоу ошибка времени выполнения, когда я нажимаю на кнопку, как в журнале кошки ..

05-08 02:54:05.932: D/AndroidRuntime(922): Shutting down VM 
05-08 02:54:05.999: W/dalvikvm(922): threadid=1: thread exiting with uncaught exception (group=0x41465700) 
05-08 02:54:06.189: E/AndroidRuntime(922): FATAL EXCEPTION: main 
05-08 02:54:06.189: E/AndroidRuntime(922): java.lang.NullPointerException 
05-08 02:54:06.189: E/AndroidRuntime(922): at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:224) 
05-08 02:54:06.189: E/AndroidRuntime(922): at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:164) 
05-08 02:54:06.189: E/AndroidRuntime(922): at com.example.databasetest.DBHelper.<init>(DBHelper.java:22) 
05-08 02:54:06.189: E/AndroidRuntime(922): at com.example.databasetest.MainActivity$1.onClick(MainActivity.java:49) 
05-08 02:54:06.189: E/AndroidRuntime(922): at android.view.View.performClick(View.java:4240) 
05-08 02:54:06.189: E/AndroidRuntime(922): at android.view.View$PerformClick.run(View.java:17721) 
05-08 02:54:06.189: E/AndroidRuntime(922): at android.os.Handler.handleCallback(Handler.java:730) 
05-08 02:54:06.189: E/AndroidRuntime(922): at android.os.Handler.dispatchMessage(Handler.java:92) 
05-08 02:54:06.189: E/AndroidRuntime(922): at android.os.Looper.loop(Looper.java:137) 
05-08 02:54:06.189: E/AndroidRuntime(922): at android.app.ActivityThread.main(ActivityThread.java:5103) 
05-08 02:54:06.189: E/AndroidRuntime(922): at java.lang.reflect.Method.invokeNative(Native Method) 
05-08 02:54:06.189: E/AndroidRuntime(922): at java.lang.reflect.Method.invoke(Method.java:525) 
05-08 02:54:06.189: E/AndroidRuntime(922): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737) 
05-08 02:54:06.189: E/AndroidRuntime(922): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 
05-08 02:54:06.189: E/AndroidRuntime(922): at dalvik.system.NativeStart.main(Native Method) 
05-08 02:54:09.589: I/Process(922): Sending signal. PID: 922 SIG: 9 
+0

Выработала? –

+0

Ваш 'ctxx' не был инициализирован. попробуйте «DBHelper DB = new DBHelper (getApplicationContext());' – Rustam

+0

, если это полезно принять или перенести. –

ответ

2

ctxx не был инициализирован, и это, вероятно, причина аварии. Вообще говоря, когда вы работаете с подклассом «Активность» и «Фрагмент», вам почти никогда не нужно ссылаться на контекст. Активность является подклассом Context и обычно this. В фрагмента вы можете получить контекст Activity хостинг фрагмента с getActivity()

Chanté

DBHelper DB=new DBHelper(ctxx); 

с

DBHelper DB=new DBHelper(MainActivity.this); 

Как @DerGolem отметили, вы используете тип INTEGER для столбец MOTHER_NAME. Возможно, вы хотите использовать TEXT, вместо этого, и вы будете нуждаться в первичный ключ "_id"

db.execSQL("CREATE TABLE " + TABLE_NAME + " (" 
       + BaseColumns._ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " 
       + NAME + " TEXT," 
       + FATHER_NAME + " TEXT," 
       + MOTHER_NAME + " TEXT" 
       + ");"); 
+2

@DerGolem спасибо за указание – Blackbelt

+1

@Blackbelt вы должны удалить ',' ...его создание таблицы – Moudiz

+2

большое вам спасибо. –

0

В вашей деятельности Инициализировать ctxx в OnCreate:

ctxx = это;

или

DBHelper DB = новый DBHelper (MainActivity.this);

всякий раз, когда вы инициализируете объект базы данных, будет null, вы получите исключение блокировки sqlite.

+0

большое вам спасибо ... –

0

фиксируем Также этот

public void onCreate(SQLiteDatabase db) { 
     data=db; 
     db.execSQL("CREATE TABLE " + TABLE_NAME + " (" 
       + NAME + " TEXT," 
       + FATHER_NAME + " TEXT," 
       + MOTHER_NAME + " TEXT" 
       + ");"); 
     Log.d("DATABASE OPERATION", "TABLE CREATED"); 


    } 

для "INTEGER," удалить,.

и введите его так, как этот DBHelper. Метод

DBHelper DB=new DBHelper(MainActivity.this); 
+1

большое вам спасибо ... –

0

Вам нужно INIT ctxx в OnCreate():

ctxx = this; 

Если вы хотите узнать больше о SQLite на андроид -> ОК. Но если вы хотите меньше кода, вы можете попробовать некоторые SqliteLibrary для Android. (пример ActiveAndroid, GreenDAO .....).

Смежные вопросы