Java 用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

我正在尝试用SQLite项填充ListView。在阅读了本文和其他教程/示例后,我尝试了以下代码,但我无法确定问题出在哪里,因为它没有按预期工作,ListView没有显示任何项目。我的数据库只有一种类型的数据,一个名为
句子
的字符串。任何能至少为我指明解决问题方向的帮助都将不胜感激

首先,我做了一个
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)
to
cursor=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:)只是开玩笑:)