2015-09-29 3 views
0

Мне нужно создать приложение, и для этого мне нужно создать базу данных. Я могу создавать новые записи, но я не знаю, как читать базу данных, чтобы получить сохраненные данные и поместить их в ListView.SimpleCursorAdapter для получения данных из базы данных в ListView

public class DatabaseHelper extends SQLiteOpenHelper { 

private static final String DATABASE_NAME="students.db"; 
private static final String TABLE_NAME="student_details"; 
private static final String COL_1="ID"; 
private static final String COL_2="NAME"; 
private static final String COL_3="SURNAME"; 
private static final String COL_4="MARKS"; 
private static final int DATABASE_VERSION=1; 

public DatabaseHelper (Context context) 
{ 
    super(context, DATABASE_NAME, null, DATABASE_VERSION); 

} 



@Override 
public void onCreate(SQLiteDatabase db) { 


db.execSQL("create table " + TABLE_NAME + "(ID INTEGER PRIMARY KEY AUTOINCREMENT,NAME TEXT,SURNAME TEXT,MARKS INTEGER)"); 

    Log.d("info", "TABLE WAS CREATED"); 


} 

@Override 
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 

    db.execSQL("DROP TABLE IF EXIST " + TABLE_NAME); 
    onCreate(db); 
    Log.d("Info","TABLE WAS UPDATED"); 

} 

public boolean insertdata(String name,String surname,String marks) 
{ 

    SQLiteDatabase db= this.getWritableDatabase(); 

    ContentValues contentValues= new ContentValues(); 
    contentValues.put(COL_2,name); 
    contentValues.put(COL_3, surname); 
    contentValues.put(COL_4, marks); 

    long result=db.insert(TABLE_NAME,null,contentValues); 
    if (result==-1) 
     return false; 
    else 
     return true; 

} 
public Cursor getallData() 
{ 
    SQLiteDatabase db= this.getWritableDatabase(); 

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

} 
public boolean updateData(String id,String name,String surname,String marks) { 
    SQLiteDatabase db = this.getWritableDatabase(); 

    ContentValues contentValues = new ContentValues(); 
    // contentValues.put(COL_1, id); 
      contentValues.put(COL_2, name); 
    contentValues.put(COL_3, surname); 
    contentValues.put(COL_4, marks); 

    db.update(TABLE_NAME, contentValues, COL_1 + " =? ", new String[]{id}); 
    return true; 

} 
public Cursor getData(int id){ 
    SQLiteDatabase db = this.getReadableDatabase(); 
    Cursor res = db.rawQuery("select * from student_details where ID="+id+"", null); 
    if(res != null && res.moveToFirst()) { 
     return res; 
    } 
    return res; 
} 
public int deleteData(String id) 
{ 
    SQLiteDatabase db = this.getWritableDatabase(); 
    return db.delete(TABLE_NAME, COL_1 + " =?", new String[]{id}); 

} 

public class DisplayData extends Activity { 

    DatabaseHelper myDB; 
    ListView list; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.data_display); 
     list= (ListView) findViewById(R.id.listView); 
     myDB= new DatabaseHelper(this); 
     //Cursor res = myDB.getallData(); 
     String[] from={"ID","NAME","SURNAME","MARKS"}; 

     int[] to={R.id.textView11,R.id.textView13,R.id.textView15 }; 
     Cursor cursor=myDB.getallData(); 
     // allData(); 
     SimpleCursorAdapter adapter= new SimpleCursorAdapter(this,R.layout.custom_data_display,cursor,from,to); 
     list.setAdapter(adapter); 
     // adapter= new ArrayAdapter(this,R.layout.custom_data_display,) 


    } 


Это ошибка, я получаю:

com.example.ky.studentmarks E/AndroidRuntime﹕ FATAL EXCEPTION: main 
     Process: com.example.aeiltech.studentmarks, PID: 23469 
     java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.ky.studentmarks/com.example.aeiltech.studentmarks.DisplayData}: java.lang.IllegalArgumentException: column '_id' does not exist 
       at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2436) 
       at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2498) 
       at android.app.ActivityThread.access$900(ActivityThread.java:179) 
       at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1324) 
       at android.os.Handler.dispatchMessage(Handler.java:102) 
       at android.os.Looper.loop(Looper.java:146) 
       at android.app.ActivityThread.main(ActivityThread.java:5641) 
       at java.lang.reflect.Method.invokeNative(Native Method) 
       at java.lang.reflect.Method.invoke(Method.java:515) 
       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1288) 
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1104) 
       at dalvik.system.NativeStart.main(Native Method) 

ответ

0

Вы должны сначала попробовать учебник, прежде чем прыгать в кодировании, что вы не понимаете.
Официальный:
1. http://developer.android.com/training/basics/data-storage/databases.html.
похожее:
2. Android column '_id' does not exist?.
Хороший учебник:
3. http://www.vogella.com/tutorials/AndroidSQLite/article.html.
Ваша проблема заключается в том, что у вас нет этого столбца («_ id»), который требуется SimpleCursor в базе данных. Проверьте (2) для этой проблемы, что у вас есть, а также для того, чтобы понять, как устранить проблему, посмотрите (3).
Счастливое кодирование.

0

Изменить id_id в вашем столе. Кроме того, вам необходимо объявить SimpleCursorAdapter adapter как поле класса DisplayData не как локальную переменную в пределах onCreate.

+0

Все еще есть проблема @saeed – Karthick

+0

Не могли бы вы отправить сообщение об ошибке, с которым вы столкнулись? –

+0

В сообщении об ошибке указано, что столбец _id не существует. Первый столбец вашей таблицы должен иметь имя _id. Кроме того, объявите его как '_id целочисленного первичного ключа автоинкремент'. –

-1

Попробуйте создать свою базу данных, как это:

private static final String DATABASE_CREATE = "create table " 
     + TABLE_NAME + "(" + COL_1 + 
     " integer primary key autoincrement, " + 
     COL_2 + " text not null, " + COL_3 + " text not null, " + COL_4 + " integer);"; 

@Override 
public void onCreate(SQLiteDatabase db) { 
    db.execSQL(DATABASE_CREATE); 
} 

Также в public Cursor getallData(), убедитесь в том, res.moveToFirst(), перед вами return res.

Взгляните на voggela tutorial, потому что вам необходимо иметь класс DAO для доступа к данным из базы данных, не используя его напрямую.

+0

У меня есть SAme PRoblem – Karthick

+0

В вашей функции insert() вы не ставите ID – Lazai

+0

Что-то вроде: long insertId = db.insert (DatabaseHelper.TABLE_NAME, null, contentValues); Курсор курсор = db.query (DatabaseHelper.TABLE_NAME, allColumns, DatabaseHelper.COL_1 + "=" + insertId, null, null, null, null); – Lazai