2016-06-08 149 views
0

我試圖從數據庫中檢索數據,但是當我撥打showData()時,應用程序停止。一切看起來不錯,但我不知道爲什麼會發生。請幫助,我是Android新手。從sqlite數據庫訪問數據?

這屬於主要活動:

public class MainActivity extends AppCompatActivity { 
    Button allContact,addContact,editContact,searchContact,deleteContact; 
    EditText name,phone;Button add; 
    TextView t,t2; 
    String dbString=""; 
    String dbString2=""; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     allContact=(Button)findViewById(R.id.button); 
     addContact =(Button)findViewById(R.id.button2); 
     editContact=(Button)findViewById(R.id.button3); 
     searchContact=(Button)findViewById(R.id.button4); 
     deleteContact =(Button)findViewById(R.id.button5); 

     addContact.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       setContentView(R.layout.addcontectlayout_main); 
       name=(EditText)findViewById(R.id.editText); 
       phone=(EditText)findViewById(R.id.editText2); 
       add=(Button)findViewById(R.id.button6); 

       add.setOnClickListener(new View.OnClickListener() { 
        @Override 
        public void onClick(View v) { 
         String takeName=name.getText().toString().toLowerCase(); 
         String takePhone=phone.getText().toString(); 


         ContactDatabase onbOfContactDatabase=new ContactDatabase(getBaseContext()); 
         onbOfContactDatabase.insertContact(takeName,takePhone); 
         Toast.makeText(getBaseContext(), "data is inserted", Toast.LENGTH_LONG).show(); 

        } 
       }); 
      } 
     }); 

     allContact.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       Intent intent = new Intent(v.getContext(), AllContact.class); 
       startActivity(intent); 


      } 
     }); 

    } 
} 

這堂課後,打算入手:

public class AllContact extends AppCompatActivity { 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.allcontactlayout_main); 

     TextView t=(TextView)findViewById(R.id.textView); 
     TextView t2=(TextView)findViewById(R.id.textView2); 

     ContactDatabase onbOfContactDatabase=new ContactDatabase(getBaseContext()); 

     Cursor get= onbOfContactDatabase.showData(); 
     //when i call showData application stope. 


    } 
} 

這屬於數據庫:

public class ContactDatabase extends SQLiteOpenHelper { 
    SQLiteDatabase db; 
    public static final String DATABASE_NAME="totalContact.db"; 
    public static final String TABLE_NAME="contact"; 
    public static final String NAME="name"; 
    public static final String PHONE="phone"; 

    public ContactDatabase(Context context) { 
     super(context, DATABASE_NAME, null, 1); 

    } 

    @Override 
    public void onCreate(SQLiteDatabase db) { 
     try { 
      db.execSQL("craete table contact" + 
        "(id integer primary key autoincrement, name text, phone text)"); 
     }catch(android.database.SQLException e){ 

     } 
    } 

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

    public void insertContact(String nam,String mob){ 

     db=this.getWritableDatabase(); 
     ContentValues contentValues=new ContentValues(); 

     contentValues.put(NAME,nam); 
     contentValues.put(PHONE,mob); 

     db.insert(TABLE_NAME, null, contentValues); 
     db.close(); 
    } 

    public Cursor showData(){ 

     db=this.getWritableDatabase(); 

     Cursor res = db.rawQuery("SELECT * FROM contact", null); 
     return res; 

    } 
} 

logcat的是:

01-06 21:51:36.282 177-177/? A/libc: invalid address or address of corrupt block 0xa2be0 passed to dlfree 
06-08 21:53:00.359 11680-11680/? E/AndroidRuntime: FATAL EXCEPTION: main 
                Process: com.example.firstproject.contactinfo, PID: 11680 
                android.database.sqlite.SQLiteException: no such table: contact (code 1): , while compiling: SELECT * FROM contact 
                 at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method) 
                 at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:889) 
                 at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:500) 
                 at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:588) 
                 at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:58) 
                 at android.database.sqlite.SQLiteQuery.<init>(SQLiteQuery.java:37) 
                 at android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:44) 
                 at android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1316) 
                 at android.database.sqlite.SQLiteDatabase.rawQuery(SQLiteDatabase.java:1255) 
                 at com.example.firstproject.contactinfo.ContactDatabase.showData(ContactDatabase.java:58) 
                 at com.example.firstproject.contactinfo.MainActivity$2.onClick(MainActivity.java:64) 
                 at android.view.View.performClick(View.java:4761) 
                 at android.view.View$PerformClick.run(View.java:19767) 
                 at android.os.Handler.handleCallback(Handler.java:739) 
                 at android.os.Handler.dispatchMessage(Handler.java:95) 
                 at android.os.Looper.loop(Looper.java:135) 
                 at android.app.ActivityThread.main(ActivityThread.java:5312) 
                 at java.lang.reflect.Method.invoke(Native Method) 
                 at java.lang.reflect.Method.invoke(Method.java:372) 
                 at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:901) 
                 at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:696) 
+0

請編輯與**完整的** logcat你得到的錯誤的問題。沒有它,任何人都不可能幫到你。 – Vucko

+0

此外,爲什麼'onClickListener'中的'setContentView(R.layout.allcontactlayout_main);'。在**初始化任何'view'元素之前,將該行移至'onCreate'方法**。 (在'super.onCreate'之後)。 – Vucko

+0

@Vucko setContentView(R.layout。allcontactlayout_main);因爲我希望在「allcontactlayout_main」佈局中顯示數據庫的所有元素。 –

回答

0

在初始化任何視圖元素(緊接着super.onCreate之後)之前,將setContentView(R.layout.allcontactlayout_main)onClickListener移至onCreate方法。

該行初始化該活動的視圖,你不能FINDallContact按鈕(我假設它的按鈕),你已經設置的內容視圖之前。 內容視圖持有按鈕和其他元素,並在該視圖上調用方法findViewById

0

首先從onClickListener移動你的setContentView(R.layout.allcontactlayout_main)到onCreate方法,然後

public Cursor showData() 
{ 
    SQLiteDatabase database = this.getReadableDatabase(); 
    String selectQuery = "SELECT * FROM contact"; 
    return database.rawQuery(selectQuery, null); 

} 

調用數據庫showdata()方法

ContactDatabase onbOfContactDatabase=new ContactDatabase(YOURACTIVITY.this); 
Cursor get= onbOfContactDatabase.showData(); 
0

1)你應該聲明你TextView tTextView t2之前的onCreate方法。隨後的onCreate內初始化它們像

t = (TextView)findViewById(R.id.textView);

t2 = (TextView)findViewById(R.id.textView2);

2)最好是有兩個,負責開啓和關閉數據庫的其他方法。這是我創建的數據庫類的示例。

public class DaysDatabase { 

    //some variables 

    private DbHelper ourHelper; 
    private final Context ourContext; 
    private SQLiteDatabase ourDatabase; 

    private static class DbHelper extends SQLiteOpenHelper { 

     //again some code 

    } 

    public DaysDatabase open(){ 
     ourHelper = new DbHelper(ourContext); 
     ourDatabase = ourHelper.getWritableDatabase(); 
     return this; 
    } 

    public void close() { 
     ourHelper.close(); 
    } 

    //your method 
    public Cursor showData(){ 
     Cursor res = ourDatabase.rawQuery("SELECT * FROM contact", null); 
     return res; 

    } 

    /* 
    * rest of the necessary code 
    */ 
} 

爲了更好地理解看看這個教程:

https://thenewboston.com/videos.php?cat=6&video=16832

本教程流傳的幾部影片,但我發現它們非常有用。