2016-06-08 145 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

本教程流传的几部影片,但我发现它们非常有用。