我需要在Android中使用simplecursor适配器绑定gridview,这是我的代码:
public class AndroidSqliteActivity extends Activity {
private Veritabani ogrenciler;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
setContentView(R.layout.main);
ogrenciler = new Veritabani(this);
final EditText adi=(EditText) findViewById(R.id.editText1);
final EditText soyadi=(EditText) findViewById(R.id.editText2);
Button verigonder=(Button) findViewById(R.id.verigonder);
Button button1 =(Button) findViewById(R.id.button1);
button1.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
try{
Intent i = new Intent(AndroidSqliteActivity.this, AndroidVeriActivity.class);
startActivity(i);
}
catch(RuntimeException e)
{
Log.e("ERROR", "ERROR IN CODE: " + e.toString());
}
}
});
verigonder.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
try{
KayitEkle(adi.getText().toString(),soyadi.getText().toString());
Cursor cursor = KayitGetir();
KayitGoster(cursor);
}
catch (SQLiteException e) {
Log.d("eHata", e.getLocalizedMessage());
}
finally{
ogrenciler.close();
}
}
});
}
private void KayitEkle(String isim, String soyad){
SQLiteDatabase db = ogrenciler.getWritableDatabase();
ContentValues veriler = new ContentValues();
veriler.put("isim", isim);
veriler.put("soyad",soyad);
db.insertOrThrow("ogrenciisim", null, veriler);
}
private Cursor KayitGetir(){
SQLiteDatabase db = ogrenciler.getReadableDatabase();
Cursor cursor = db.query("ogrenciisim", new String[] {"id", "isim", "soyad"}, null, null, null, null, null);
startManagingCursor(cursor);
return cursor;
}
private void KayitGoster(Cursor cursor){
try{
final GridView grid=(GridView) findViewById(R.id.gridView1);
String[] columns = new String[] { "id", "isim", "soyad" };
int[] to = new int[] { R.id.textView122, R.id.textView222, R.id.textView322 };
SimpleCursorAdapter mAdapter = new SimpleCursorAdapter(this, R.layout.gridview, cursor, columns, to);
grid.setAdapter(mAdapter);
}
catch(Exception e)
{
Log.d("eHata", e.getLocalizedMessage());
}
}
}
这是我的数据库类:
public class Veritabani extends SQLiteOpenHelper {
private static final String VERITABANI = "Ogrenciler";
private static final int SURUM = 1;
public Veritabani(Context con)
{
super (con,VERITABANI,null,SURUM);
}
@Override
public void onCreate(SQLiteDatabase db) {
// TODO Auto-generated method stub
db.execSQL("create table ogrenciisim(id integer primary key, isim text, soyad text);");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("drop table if exist ogrenciisim");
onCreate(db);
}
}
但它给出了一个错误“索引-1请求大小为18(16-20)”我做错了什么?
PS:我改变了它,就像Barak提到的那样,但现在它给出了错误:“列id不存在” 非常感谢
答案 0 :(得分:0)
你没有正确设置。
此:
String[] columns = new String[] {
cursor.getString((cursor.getColumnIndex("id"))),
cursor.getString((cursor.getColumnIndex("isim"))),
cursor.getString((cursor.getColumnIndex("soyad"))) };
应该是这样的:
String[] columns = new String[] { "id", "isim", "soyad" };
您的实现正在尝试从游标中读取值。适配器将读取光标,您只需要告诉它将哪些列放入哪些资源。
修改强>
好的,这是一个猜测,但看着你的代码,我认为是一个坚实的代码。
您根据我的建议(修复空间问题)更改了数据库结构,但实际上并未将数据库结构更改为数据库版本,因此onUpgrade方法未触发,重新创建了数据库。
改变这个:
private static final int SURUM = 1;
对此:
private static final int SURUM = 2;
运行应用程序,您的数据库将使用新的(正确的)结构重新创建。这应该解决问题,因为它无法找到该列。
你提到的另一个错误“但是它给出了一个大小为18(16-20)的错误索引-1”通常意味着你试图在没有先执行cursor.moveToFirst
的情况下访问游标...但是我没有从你发布的代码中看到可能发生的地方。您可以尝试将它作为gridview的try语句中的第一个内容(或者在创建它之前使用startManagingCursor
之后再执行它)