Java 用SQLite填充ListView-ListView会追加行,但不会';不显示文本
我正在尝试用SQLite项填充ListView。在阅读了本文和其他教程/示例后,我尝试了以下代码,但我无法确定问题出在哪里,因为它没有按预期工作,ListView没有显示任何项目。我的数据库只有一种类型的数据,一个名为Java 用SQLite填充ListView-ListView会追加行,但不会';不显示文本,java,android,sqlite,listview,Java,Android,Sqlite,Listview,我正在尝试用SQLite项填充ListView。在阅读了本文和其他教程/示例后,我尝试了以下代码,但我无法确定问题出在哪里,因为它没有按预期工作,ListView没有显示任何项目。我的数据库只有一种类型的数据,一个名为句子的字符串。任何能至少为我指明解决问题方向的帮助都将不胜感激 首先,我做了一个FavoritesDataBaseCore.java: package com.easyprojects.artgames; import android.content.Context; impor
句子的字符串。任何能至少为我指明解决问题方向的帮助都将不胜感激
首先,我做了一个FavoritesDataBaseCore.java
:
package com.easyprojects.artgames;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
/**
* Created by Vinicius on 19/05/2017.
*/
public class FavoritesDataBaseCore extends SQLiteOpenHelper {
public static final int DATABASE_VERSION = 1;
public static final String DATABASE_NAME = "Favorites.db";
public FavoritesDataBaseCore(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("create table favorite(_id integer primary key autoincrement, sentence text not null)");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("drop table if exists favorite");
onCreate(db);
}
}
应通过点击CharacterActivity.java
中的按钮添加句子
,相关代码:
ImageButton setFavoriteBtn;
private SQLiteDatabase database;
FavoritesDataBaseCore helper;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_character);
setFavoriteBtn = (ImageButton) findViewById(R.id.setFavoriteBtnId);
setFavoriteBtn.setOnClickListener(this);
// Database stuff
helper = new FavoritesDataBaseCore(this);
database = helper.getWritableDatabase();
}
// Code below is inside public void onClick(View view)
case R.id.setFavoriteBtnId:
ContentValues values = new ContentValues();
values.put("sentence", characterTV.getText().toString());
database.insert("favorite", null, values);
// A Toast here showing values.toString() works well
break;
private SQLiteDatabase database;
FavoritesDataBaseCore helper;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_favorites);
helper = new FavoritesDataBaseCore(this);
database = helper.getReadableDatabase();
String[] field = {"sentence"};
int[] to = new int[]{R.id.SentenceAd};
Cursor cursor = getData();
SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, android.R.layout.simple_list_item_1, cursor, field, to, 0);
final ListView FavoritesListView = (ListView) findViewById(R.id.listviewID); // ListView
FavoritesListView.setAdapter(adapter);
}
public Cursor getData(){
Cursor cursor;
String[] field = {"sentence"};
cursor = database.query("favorite",null,null,null,null,null,null);
return cursor;
}
最后是包含ListView并创建游标的活动,我怀疑问题在这里,因为游标是为ListView设置正确适配器的主要责任,FavoritesActivity.java
,相关代码:
ImageButton setFavoriteBtn;
private SQLiteDatabase database;
FavoritesDataBaseCore helper;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_character);
setFavoriteBtn = (ImageButton) findViewById(R.id.setFavoriteBtnId);
setFavoriteBtn.setOnClickListener(this);
// Database stuff
helper = new FavoritesDataBaseCore(this);
database = helper.getWritableDatabase();
}
// Code below is inside public void onClick(View view)
case R.id.setFavoriteBtnId:
ContentValues values = new ContentValues();
values.put("sentence", characterTV.getText().toString());
database.insert("favorite", null, values);
// A Toast here showing values.toString() works well
break;
private SQLiteDatabase database;
FavoritesDataBaseCore helper;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_favorites);
helper = new FavoritesDataBaseCore(this);
database = helper.getReadableDatabase();
String[] field = {"sentence"};
int[] to = new int[]{R.id.SentenceAd};
Cursor cursor = getData();
SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, android.R.layout.simple_list_item_1, cursor, field, to, 0);
final ListView FavoritesListView = (ListView) findViewById(R.id.listviewID); // ListView
FavoritesListView.setAdapter(adapter);
}
public Cursor getData(){
Cursor cursor;
String[] field = {"sentence"};
cursor = database.query("favorite",null,null,null,null,null,null);
return cursor;
}
我的数据库适配器.xml
如下所示:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/SentenceAd"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="TextView" />
</LinearLayout>
编辑:根据@MikeT的建议修改代码后,我得出结论,每次向数据库中添加值时,我的ListView都会追加行,但这些行中从未显示语句。。前几个与创建光标相关,以准备SimpleCorsorAdapter使用它。然后还有一个问题是如何实例化/s设置的simplecursorsdapter
光标。
游标数据表要求名为\u id的列存在。要解决此问题,光标应包括两列。最简单的方法是使用null作为查询方法的第二个参数
改变
cursor = database.query("favorite",field,null,null,null,null,null);
到
从查询方法返回的游标将不为null(cusror.getCount()
是检查无行的方式),因此不需要或不使用检查它是否为null。此外,光标Adpater(简单或自定义)将执行必要的光标导航。无需移动光标。原件已相应编辑,因此无需更改
最后,关于游标,关闭数据库将关闭游标(同样已编辑)
SimpleCorsorAdapter
问题在于,您使用的是android.R.layout.simple_list_item_1(第二个参数)中提供的布局(第二个参数),这要求您指示将在特定的文本视图中显示哪个光标列(您已表示句子),但您已经在自己的布局中提供了文本视图
改变
int[] to = new int[]{R.id.SentenceAd};
到
是解决问题的一种方法,但创建自己的布局会浪费您的时间和精力
要使用您自己的布局,请不要进行上述更改(因为您希望在布局中使用TextView的id),而是进行更改
SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, android.R.layout.simple_list_item_1, cursor, field, to, 0);
使用您的布局
SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, R.layout.database_adapter, cursor, field, to, 0);
简言之,第二个参数(要使用的布局)和第四个参数(光标中的列,按名称)和第五个参数(列中的数据将被放置在布局中的文本视图的ID)是相互依赖的。我认为您的问题可能是必须有_ID才能使光标适配器工作。尝试更改cursor=database.query(“收藏夹”,字段,null,null,null,null)
tocursor=database.query(“收藏夹”,null,null,null,null,null)代码>。i、 e.null作为第二个参数,这实际上意味着获取所有列。P.S.游标永远不会为空,而是使用cursor.getCount()
获取游标中的行数。但是,甚至不要移动光标,适配器将处理定位。也不要关闭数据库,这将关闭游标。您确定您的游标从表中获取任何数据吗?@MikeT将null
传递给第二个参数,不幸的是,它无法工作。我将尝试删除如果
条件,然后@Lokeshdesa我很抱歉,但我怎么能确定呢?一个简单的Log.d()
?Log.d(“CSRCNT”,“Cursor Rows=“+Integer.toString(Cursor.getCount()))代码>或在database.close()处放置断点。将允许您查看光标有多少行。@MikeT我认为可能不需要,请检查我的问题编辑。现在是时候全部更改为使用CsutomAdapter:)只是开玩笑:)