2015-04-27 5 views
1

Im пытается считывать данные из базы данных на другую активность. Где я иду не так? программа вылетает, когда вторая активность пытается открыть. Отладчик указывает на курсор, это проблема, но я просто не знаю, в чем проблема.База данных Android SQLite

Это databasehelper

public class DatabaseHelper extends SQLiteOpenHelper 
{ 
public static final String THE_DATABASE = "theDatabase"; 
public static final String THE_TABLE = "infoTable"; 
public static final String THE_TABLE_COLUMN_ID = "id"; 
public static final String THE_TABLE_COLUMN_NAME = "name"; 
public static final String THE_TABLE_COLUMN_DETAILS = "details"; 

DatabaseHelper(Context context) 
{ 
    super(context,THE_DATABASE, null, 1); 
} 

@Override 
public void onCreate(SQLiteDatabase db) { 

    db.execSQL("create table " +THE_TABLE+"(id integer primary key, name  text, details text) "); 
} 

@Override 
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
    db.execSQL("drop table if exists "+ THE_TABLE+ " "); 

} 

public void addData(String nameIn, String detailsIn) 
{ 
    SQLiteDatabase db = this.getWritableDatabase(); 
    ContentValues data = new ContentValues(); 

    data.put("name", nameIn); 
    data.put("details", detailsIn); 

    db.insert(THE_TABLE,null,data); 

} 

public Cursor showData() 
{ 
    SQLiteDatabase db = this.getReadableDatabase(); 

    Cursor cursor; 
    cursor = db.rawQuery("select * from "+THE_TABLE+"", null); 
    return cursor; 

} 
} 

Это mainActivity

public class MainActivity extends ActionBarActivity { 

public final static String EXTRA_MESSAGE =  "com.doors.waynderful.myapp.MESSAGE"; 
DatabaseHelper myDb; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
} 


@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    // Inflate the menu; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.menu_main, menu); 
    return true; 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    // Handle action bar item clicks here. The action bar will 
    // automatically handle clicks on the Home/Up button, so long 
    // as you specify a parent activity in AndroidManifest.xml. 
    int id = item.getItemId(); 

    //noinspection SimplifiableIfStatement 
    if (id == R.id.action_settings) { 
     return true; 
    } 

    return super.onOptionsItemSelected(item); 
} 

public void sendMessage(View view){ 
    myDb = new DatabaseHelper(this); 


    Intent intent = new Intent(this,DisplayMessageActivity.class); 

    EditText editText = (EditText) findViewById(R.id.edit_name); 
    EditText editText1 = (EditText) findViewById(R.id.edit_details); 

    String name = editText.getText().toString(); 
    String details = editText1.getText().toString(); 

    myDb.addData(name, details); 

    startActivity(intent); 

} 
} 

Это активность для отображения данных из базы данных

public class DisplayMessageActivity extends ActionBarActivity { 
TextView Tview; 
DatabaseHelper db; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_display_message); 
     Tview = (TextView) findViewById(R.id.box); 

     db = new DatabaseHelper(this); 
     Cursor cursor = db.showData(); 
     cursor.moveToFirst(); 

     String nam = cursor.getString(cursor.getColumnIndex(db.THE_TABLE_COLUMN_NAME)); 

     if (!cursor.isClosed()){ 
      cursor.close(); 
     } 

    Tview.setText(nam); 

} 


@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    // Inflate the menu; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.menu_display_message, menu); 
    return true; 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    // Handle action bar item clicks here. The action bar will 
    // automatically handle clicks on the Home/Up button, so long 
    // as you specify a parent activity in AndroidManifest.xml. 
    int id = item.getItemId(); 

    //noinspection SimplifiableIfStatement 
    if (id == R.id.action_settings) { 
     return true; 
    } 

    return super.onOptionsItemSelected(item); 
} 
} 
+0

Какое сообщение ошибки? –

+0

Возможно, это не проблема, но в конце вашего оператора execSQL в классе DatabaseHelper должна быть полутол. Если ошибка говорит о том, что ваша таблица не существует, добавьте в нее пол двоеточия, удалите приложение и переустановите его, чтобы создать новую таблицу. – PPartisan

+0

Нет сообщения об ошибке, но отладчик ведет меня к SQLiteDatabase.java. public Cursor RawQuery (....) – Blacksamson79

ответ

0

Я попробовал ваш код и его похоже, работает. Но вы можете получить доступ к нулевому указателю или курсор пуст. Просто добавьте проверку кода, чтобы быть в безопасности.

if (cursor != null && cursor.moveToFirst()) 
{ 
     String nam = cursor.getString(cursor.getColumnIndex(db.THE_TABLE_COLUMN_NAME)); 
     Tview.setText(nam); 
} 

if (!cursor.isClosed()) 
{ 
     cursor.close(); 
} 
+0

Благодарим за помощь. вы были чрезвычайно полезны. – Blacksamson79

+0

Работает ли он сейчас? –

+0

да, это ... у меня возникла проблема с созданием базы данных. все отсортировано сейчас ..... Cheers – Blacksamson79