gpt4 book ai didi

android - 将项目从 listView 存储到应用程序的 SqLite 数据库

转载 作者:行者123 更新时间:2023-11-30 02:13:21 26 4
gpt4 key购买 nike

我正在开发一个应用程序,它可以从电话联系人中选择联系人并将其显示在 ListView 中。我想将 listView 项目存储到 SQLite 数据库中,但应用程序每次都崩溃。我没有 LogCat 报告,因为 AVD 正在运行,我正在使用我的 android 设备 (Moto G2)。请耐心等待我,我只是一个寻求指导的初学者。

这是我正在使用的类:

数据库处理器类

public class DatabaseHandler extends SQLiteOpenHelper {

// database details
public static final int DATABASE_VERSION = 1;
public static final String DATABASE_NAME = "contactsManager";

// table name
public static final String TABLE_CONTACTS = "contacts";

// public static final String KEY_NAME="name";

// column names
// public static final String KEY_ID="id";
public static final String KEY_ListItem = "listitem";

public DatabaseHandler(Context context, String name, CursorFactory factory,
int version) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
// TODO Auto-generated constructor stub
}

// table creation
@Override
public void onCreate(SQLiteDatabase db) {
// TODO Auto-generated method stub
String CREATE_CONTACTS_TABLE = "CREATE TABLE" + TABLE_CONTACTS + "("
+ KEY_ListItem + "TEXT" + ")";
db.execSQL(CREATE_CONTACTS_TABLE);

}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// TODO Auto-generated method stub
db.execSQL("DROP TABLE IF EXISTS" + TABLE_CONTACTS);
onCreate(db);
}

}

PickAdapter 类

public class PickAdapter {

SQLiteDatabase database_obj;
DatabaseHandler handler_obj;
Context context;

public PickAdapter(Context c) {
context = c;
}

void addListItem(ArrayList<String> numbers) {
handler_obj = new DatabaseHandler(context,
DatabaseHandler.DATABASE_NAME, null,
DatabaseHandler.DATABASE_VERSION);
database_obj = handler_obj.getWritableDatabase();

ContentValues values = new ContentValues();
for (int i = 0; i < numbers.size(); i++) {

Log.e("vlaue inserting==", "" + numbers.get(i));
values.put(DatabaseHandler.KEY_ListItem, numbers.get(i));
database_obj.insert(DatabaseHandler.TABLE_CONTACTS, null, values);

}

database_obj.close(); // Closing database connection
}

Cursor getListItem() {
String selectQuery = "SELECT * FROM " + DatabaseHandler.TABLE_CONTACTS;

handler_obj = new DatabaseHandler(context,
DatabaseHandler.DATABASE_NAME, null,
DatabaseHandler.DATABASE_VERSION);
database_obj = handler_obj.getWritableDatabase();
Cursor cursor = database_obj.rawQuery(selectQuery, null);

return cursor;
}

}

PickActivity 类

public class PickActivity extends Activity {
/** Called when the activity is first created. */
ListView nlist;
Button b, saveButton;
DatabaseHandler handler;
PickAdapter pickAdapterObj;
ArrayList<String> phoneNumbers = new ArrayList<String>();
ArrayList<String> names = new ArrayList<String>();
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

saveButton = (Button) findViewById(R.id.button2);
b = (Button) findViewById(R.id.button1);
b.setOnClickListener(new View.OnClickListener() {

@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Intent intent = new Intent(Intent.ACTION_PICK);
intent.setType(ContactsContract.CommonDataKinds.Phone.CONTENT_TYPE);
startActivityForResult(intent, 1);

}
});

saveButton.setOnClickListener(new View.OnClickListener() {

@Override
public void onClick(View v) {
// TODO Auto-generated method stub
pickAdapterObj.addListItem(phoneNumbers);
Cursor cursor = pickAdapterObj.getListItem();

Log.e("count", "" + cursor.getCount());
if (cursor != null) {
cursor.moveToNext();

do {

Log.e("value==", "" + cursor.getString(1));

} while (cursor.moveToNext());
}

}
});

}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
// TODO Auto-generated method stub
if (data != null) {
Uri uri = data.getData();
if (uri != null) {
Cursor c = null;
try {
c = getContentResolver()
.query(uri,
new String[] {
ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME,
ContactsContract.CommonDataKinds.Phone.NUMBER,
ContactsContract.CommonDataKinds.Phone.TYPE },
null, null, null);
if (c != null && c.moveToFirst()) {
String name = c.getString(0);
String number = c.getString(1);
// int type = c.getInt(2);
storeInArrays(name, number);

}
} finally {
if (c != null) {
c.close();
}
}
}
}
}

public void storeInArrays(String name, String number) {

ListView noList = (ListView) findViewById(R.id.listView2);
ListView nameList = (ListView) findViewById(R.id.listView1);
names.add(name);
phoneNumbers.add(number);
ArrayAdapter<String> numberAdapter = new ArrayAdapter<String>(this,
android.R.layout.simple_list_item_1, phoneNumbers);
noList.setAdapter(numberAdapter);

ArrayAdapter<String> nameAdapter = new ArrayAdapter<String>(this,
android.R.layout.simple_list_item_1, names);
nameList.setAdapter(nameAdapter);

Toast.makeText(getApplicationContext(), "added", Toast.LENGTH_LONG)
.show();

}

}

最佳答案

您应该采用 Google 推荐的标准“Content Provider、Data Loader、Cursor adapter”方法,采用更稳健的方法。

this implementation ,它具有这种方法的完整框架。它的代码有点多,但是数据 Content Provider 的分离最终应该会为您省去很多麻烦(即数据更改时的列表更新)。

祝你好运

关于android - 将项目从 listView 存储到应用程序的 SqLite 数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29796732/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com