android - 具有 ListView 可见性的 SimpleCursorAdapter
问题描述
您好我创建了一个数据库,我试图在列表视图中列出该数据库的名称,但没有显示任何内容。
mty 数据库的代码是:
public class LockedInDatabaseHelper extends SQLiteOpenHelper {
private static final String DB_NAME = "Locked In";
private static final int DB_VERSION = 1;
public LockedInDatabaseHelper(Context context) {
super(context, DB_NAME, null, DB_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("CREATE TABLE ARTISTS (_id INTEGER PRIMARY KEY AUTOINCREMENT,"
+ "NAME TEXT,"
+ "INTRO TEXT,"
+"IMAGE_RESCOURCE_ID INT)");
insertArtist(db, "Jinx Inkz", "An artist who specializes in portraits and custom pieces", R.drawable.jinx_profile);
insertArtist(db, "Bazooka Zook", "An artist who specializes in clean line work and neo - traditional", R.drawable.zook_profile );
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
private static void insertArtist(SQLiteDatabase db, String name, String intro, int resourceId){
ContentValues artistInfo = new ContentValues();
artistInfo.put("NAME", name);
artistInfo.put("INTRO", intro);
artistInfo.put("IMAGE_RESOURCE_ID", resourceId);
db.insert("ARTISTS",null, artistInfo);
}
}
最后,我希望信息出现的地方的java代码是
public class ArtistsActivity extends AppCompatActivity {
private SQLiteDatabase db;
private Cursor cursor;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_artists);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
ListView listArtists = (ListView) findViewById(R.id.artistsLV);
SQLiteOpenHelper lockedInDatabaseHelper = new LockedInDatabaseHelper(ArtistsActivity.this);
try {
db = lockedInDatabaseHelper.getReadableDatabase();
cursor = db.query("ARTISTS",
new String[]{"_id", "NAME"},
null, null, null, null, null);
SimpleCursorAdapter listAdapter = new SimpleCursorAdapter(ArtistsActivity.this,
android.R.layout.simple_list_item_1,
cursor,
new String[]{"NAME"},
new int[] {android.R.id.text1},
0);
listArtists.setAdapter(listAdapter);
} catch (SQLiteException e) {
Toast toast = Toast.makeText(this, "Database unavailable", Toast.LENGTH_LONG);
toast.show();
}
//Create a listener for clicks on listview
AdapterView.OnItemClickListener itemClickListener =
new AdapterView.OnItemClickListener() {
public void onItemClick(AdapterView<?> listArtists,
View itemView,
int position,
long id){
//Pass tha artist user clicks on to artistActivity
Intent intent = new Intent(ArtistsActivity.this, ArtistDetail.class);
intent.putExtra(ArtistDetail.EXTRA_ARTISTID, (int) id);
startActivity(intent);
}
};
//Assign the listener to list view
listArtists.setOnItemClickListener(itemClickListener);
}
@Override
public void onDestroy(){
super.onDestroy();
cursor.close();
db.close();
}
}
我已经检查了很多代码,但我认为它与 ListView 无关。请帮忙!我超级卡住了,我只想要一个列表,我可以添加一个 onClickListener 以继续应用程序。
解决方案
您的问题是您拼错了列名IMAGE_RESOURCE_ID。也就是说,您使用列名IMAGE_RESCOURCE_ID创建表,但尝试插入列IMAGE_RESOURCE_ID。
我建议始终对表名和列名使用常量,因此您只需定义它们一次,然后使用相同的常量来引用这些项目。
因此,我建议将数据库助手LockedInDatabaseHelper.java更改为:-
public class LockedInDatabaseHelper extends SQLiteOpenHelper {
private static final String DB_NAME = "Locked In";
private static final int DB_VERSION = 1;
public static final String TBL_ARTISTS = "ARTISTS";
public static final String COL_ID = BaseColumns._ID;
public static final String COl_NAME = "NAME";
public static final String COL_INTRO = "INTRO";
public static final String COL_IMAGERESOURCEID = "IMAGE_RESOURCE_ID";
public LockedInDatabaseHelper(Context context) {
super(context, DB_NAME, null, DB_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("CREATE TABLE ARTISTS (" + COL_ID + " INTEGER PRIMARY KEY,"
+ COl_NAME + " TEXT,"
+ COL_INTRO + " TEXT,"
+ COL_IMAGERESOURCEID + " INT)");
insertArtist(db, "Jinx Inkz", "An artist who specializes in portraits and custom pieces", R.drawable.jinx_profile);
insertArtist(db, "Bazooka Zook", "An artist who specializes in clean line work and neo - traditional",R.drawable.zook_profile);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
private static void insertArtist(SQLiteDatabase db, String name, String intro, int resourceId){
ContentValues artistInfo = new ContentValues();
artistInfo.put(COl_NAME, name);
artistInfo.put(COL_INTRO, intro);
artistInfo.put(COL_IMAGERESOURCEID, resourceId);
db.insert(TBL_ARTISTS,null, artistInfo);
}
}
除了对ArtistsActivity.java进行一些更改外,还可以利用常量,以便它包含:-
cursor = db.query(LockedInDatabaseHelper.TBL_ARTISTS,
new String[]{LockedInDatabaseHelper.COL_ID, "NAME"},
null, null, null, null, null);
SimpleCursorAdapter listAdapter = new SimpleCursorAdapter(ArtistsActivity.this,
android.R.layout.simple_list_item_1,
cursor,
new String[]{LockedInDatabaseHelper.COl_NAME},
new int[] {android.R.id.text1},
0);
我相信上述方法会奏效。但是,当您更改数据库的结构时,您应该在重新运行应用程序之前执行以下操作之一:-
- 删除/清除应用程序的数据(这有效地删除了数据库)。
- 卸载应用程序(这也有效地删除了数据库)。
推荐阅读
- sql-server - 如何使用重复值查找 MIN 并将 MIN 值替换为 varchar
- c++ - 标准目录中包含的文件可以静默替换现有的宏吗?
- rust - Rust - 将特征对象传递给线程
- android-studio - 将 PocketSphinx 资源导入 Android Studio
- sql-server - 如何查找另一个表中的列在哪些表中用作 SQL Server 中的外键列或普通列
- firebase - 从 Datastore 迁移到 Firestore 本机模式
- python - 需要根据 WeekDay 和 TimeSlot 计算订单数量
- c++ - 独立的 asio async_connect 未触发绑定处理程序
- powershell - 创建多个文件后执行操作
- javascript - Node.js 应用程序 TypeError [ERR_INVALID_ARG_TYPE]:“路径”参数必须是字符串类型。接收到的类型对象