2016-06-08 5 views
0

Я пытаюсь извлечь данные из базы данных, но когда я звоню showData(), приложение останавливается. Все выглядит хорошо, но я не знаю, почему это происходит. Пожалуйста, помогите, я новичок в андроиде.Доступ к данным из базы данных 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

Пожалуйста, отредактируйте вопрос с ** полным ** логарифмом ошибки, которую вы получаете. Без этого вряд ли кто-нибудь может вам помочь. – Vucko

+0

Кроме того, почему 'setContentView (R.layout.allcontactlayout_main);' в 'onClickListener'. Переместите эту строку в метод 'onCreate' ** перед ** инициализацией любого из элементов' view'. (сразу после 'super.onCreate'). – Vucko

+0

@Vucko комплектContentView (R.layout.allcontactlayout_main); потому что я хочу, чтобы весь элемент базы данных отображался в макете allcontactlayout_main. –

ответ

0

Передвиньте свой setContentView(R.layout.allcontactlayout_main) с onClickListener на onCreate метод перед инициализацией любого из элементов вида (сразу после super.onCreate).

Эта линия инициализирует вид для деятельности, и вы не можете найти кнопки allContact (я предполагаю, что это кнопка), прежде чем вы установите вид контента. Это , что просмотр содержимого, который содержит кнопку и другие элементы, и с этой точки зрения вызывается метод findViewById.

0

Сначала переместите setContentView (R.layout.allcontactlayout_main) из onClickListener в 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 t и TextView 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

Учебник распространяются на несколько видео, но я нахожу их весьма полезными.

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