Sqlite 在android studio中将数据库中的行打印到列表视图中

Sqlite 在android studio中将数据库中的行打印到列表视图中,sqlite,android-studio,Sqlite,Android Studio,我知道在堆栈溢出上已经有了这个问题的答案,但是在尝试了那里的答案之后,我似乎仍然无法解决这个问题。 我正在尝试将数据库中的行显示到列表视图中。 我能够在文本视图中显示行,现在我正在尝试将其转换为列表视图 以下是sqllite代码的示例: package com.example.assignment1; import android.database.sqlite.SQLiteDatabase; import android.content.Context; import android.cont

我知道在堆栈溢出上已经有了这个问题的答案,但是在尝试了那里的答案之后,我似乎仍然无法解决这个问题。 我正在尝试将数据库中的行显示到列表视图中。 我能够在文本视图中显示行,现在我正在尝试将其转换为列表视图

以下是sqllite代码的示例:

package com.example.assignment1;
import android.database.sqlite.SQLiteDatabase;
import android.content.Context;
import android.content.ContentValues;
import android.database.Cursor;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;
public class databaseManager {
    public static final String DB_NAME = "Friends";
    public static final String DB_TABLE = "friendList";
    public static final int DB_VERSION = 1;
    private static final String CREATE_TABLE = "CREATE TABLE " + DB_TABLE +
            " (code INTEGER PRIMARY KEY, friendName TEXT, friendAge INTEGER, friendGender TEXT, friendAddress TEXT);";
    private SQLHelper helper;
    private SQLiteDatabase db;
    private Context context;
    public databaseManager(Context c) {
        this.context = c;
        helper = new SQLHelper(c);
        this.db = helper.getWritableDatabase();
    }
    public databaseManager openReadable() throws android.database.SQLException {
        helper = new SQLHelper(context);
        db = helper.getReadableDatabase();
        return this;
    }
    public void close() {
        helper.close();
    }
    public boolean addRow(Integer c, String name, int age,String gender, String address) {

        ContentValues newFriend = new ContentValues();
        newFriend.put("code", c);
        newFriend.put("friendName", name);
        newFriend.put("friendAge", age);
        newFriend.put("friendGender", gender);
        newFriend.put("friendAddress", address);
        try {
            db.insertOrThrow(DB_TABLE, null, newFriend); // another way of inserting rows
        }
        catch (Exception e) {
            Log.e("Error in inserting rows", e.toString());
            e.printStackTrace();
            return false;
        }
        db.close();
        return true;
    }
    public String retrieveRows() {
        String[] columns = new String[] {"code", "friendName", "friendAge","friendGender","friendAddress"};
        Cursor cursor = db.query(DB_TABLE, columns, null, null, null, null, null);
        String tablerows = "";
        cursor.moveToFirst();
        while (cursor.isAfterLast() == false) {
            tablerows = tablerows + cursor.getInt(0) + ", " + cursor.getString(1) + ", " +
                    cursor.getInt(2) + ", "+ cursor.getString(3) + ", "+cursor.getString(4)+ "\n";
            cursor.moveToNext();
        }
        if (cursor != null && !cursor.isClosed()) {
            cursor.close();
        }
        return tablerows;
    }

    public class SQLHelper extends SQLiteOpenHelper {
        public SQLHelper (Context c) {
            super(c, DB_NAME, null, DB_VERSION);
        }
        @Override
        public void onCreate(SQLiteDatabase db) {
            db.execSQL(CREATE_TABLE);
        }
        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
            Log.w("Products table", "Upgrading database i.e. dropping table and re-creating it");
                    db.execSQL("DROP TABLE IF EXISTS " + DB_TABLE);
            onCreate(db);
        }
    }
}
下面是java代码:

package com.example.assignment1;

import android.app.AppComponentFactory;
import android.content.Intent;
import android.os.Bundle;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ListView;
import android.widget.TextView;

import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;

import org.w3c.dom.Text;

import java.util.ArrayList;
import java.util.List;

public class viewFriends extends AppCompatActivity {
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.viewfriendlist);
        databaseManager mydb;

        mydb = new databaseManager(viewFriends.this);
        mydb.openReadable();
        List<String> list = new ArrayList<String>();
        list.add(mydb.retrieveRows());
        ArrayAdapter adapter = new ArrayAdapter<String>(this,
                R.layout.viewfriendlist,list);
        //TextView tx = (TextView)findViewById(R.id.textView119);
       // tx.setText("");

        String tableContent = mydb.retrieveRows();
        //tx.setText(tableContent);
        ListView lv = (ListView)findViewById(R.id.textView119);
        lv.setAdapter(adapter);
        mydb.close();

    }

}

您的日志显示
java.lang.IllegalStateException:ArrayAdapter要求资源ID为TextView

其中一个ArrayAdapter构造函数还包含TextView的id

不要使用接受
@NonNull上下文、@LayoutRes int resource、@NonNull List objects
的构造函数,而是使用在布局资源和列表之间还包含
@IdRes int textViewResourceId
的构造函数,如下所示
@NonNull Context Context、@LayoutRes int resource、@IdRes int textViewResourceId,@非空列表对象

在您的情况下,下面一行

ArrayAdapter adapter=新的ArrayAdapter(this,R.layout.viewfriendlist,list)

会是

ArrayAdapter adapter=新的ArrayAdapter(这个,R.layout.viewfriendlist,R.id.textView119,list)


这应该可以解决您从适配器获得的错误。您的日志显示
java.lang.IllegalStateException:ArrayAdapter要求资源ID为TextView

其中一个ArrayAdapter构造函数还包含TextView的id

不要使用接受
@NonNull上下文、@LayoutRes int resource、@NonNull List objects
的构造函数,而是使用在布局资源和列表之间还包含
@IdRes int textViewResourceId
的构造函数,如下所示
@NonNull Context Context、@LayoutRes int resource、@IdRes int textViewResourceId,@非空列表对象

在您的情况下,下面一行

ArrayAdapter adapter=新的ArrayAdapter(this,R.layout.viewfriendlist,list)

会是

ArrayAdapter adapter=新的ArrayAdapter(这个,R.layout.viewfriendlist,R.id.textView119,list)


这将解决您从适配器获得的错误

请添加viewfriendlist.xml代码请添加viewfriendlist.xml代码
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <ListView
        android:id="@+id/textView119"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:text="TextView"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
2020-08-17 19:30:35.104 19116-19116/com.example.assignment1 E/ArrayAdapter: You must supply a resource ID for a TextView
2020-08-17 19:30:35.104 19116-19116/com.example.assignment1 D/AndroidRuntime: Shutting down VM
2020-08-17 19:30:35.115 19116-19116/com.example.assignment1 E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.assignment1, PID: 19116
    java.lang.IllegalStateException: ArrayAdapter requires the resource ID to be a TextView
        at android.widget.ArrayAdapter.createViewFromResource(ArrayAdapter.java:437)
        at android.widget.ArrayAdapter.getView(ArrayAdapter.java:407)
        at android.widget.AbsListView.obtainView(AbsListView.java:2365)
        at android.widget.ListView.makeAndAddView(ListView.java:2052)
        at android.widget.ListView.fillDown(ListView.java:786)
        at android.widget.ListView.fillFromTop(ListView.java:847)
        at android.widget.ListView.layoutChildren(ListView.java:1826)
        at android.widget.AbsListView.onLayout(AbsListView.java:2164)
        at android.view.View.layout(View.java:19659)
        at android.view.ViewGroup.layout(ViewGroup.java:6075)
        at androidx.constraintlayout.widget.ConstraintLayout.onLayout(ConstraintLayout.java:1915)
        at android.view.View.layout(View.java:19659)
        at android.view.ViewGroup.layout(ViewGroup.java:6075)
        at android.widget.FrameLayout.layoutChildren(FrameLayout.java:323)
        at android.widget.FrameLayout.onLayout(FrameLayout.java:261)
        at android.view.View.layout(View.java:19659)
        at android.view.ViewGroup.layout(ViewGroup.java:6075)
        at androidx.appcompat.widget.ActionBarOverlayLayout.onLayout(ActionBarOverlayLayout.java:530)
        at android.view.View.layout(View.java:19659)
        at android.view.ViewGroup.layout(ViewGroup.java:6075)
        at android.widget.FrameLayout.layoutChildren(FrameLayout.java:323)
        at android.widget.FrameLayout.onLayout(FrameLayout.java:261)
        at android.view.View.layout(View.java:19659)
        at android.view.ViewGroup.layout(ViewGroup.java:6075)
        at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1791)
        at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1635)
        at android.widget.LinearLayout.onLayout(LinearLayout.java:1544)
        at android.view.View.layout(View.java:19659)
        at android.view.ViewGroup.layout(ViewGroup.java:6075)
        at android.widget.FrameLayout.layoutChildren(FrameLayout.java:323)
        at android.widget.FrameLayout.onLayout(FrameLayout.java:261)
        at com.android.internal.policy.DecorView.onLayout(DecorView.java:761)
        at android.view.View.layout(View.java:19659)
        at android.view.ViewGroup.layout(ViewGroup.java:6075)
        at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:2496)
        at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2212)
        at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1392)
        at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6752)
        at android.view.Choreographer$CallbackRecord.run(Choreographer.java:911)
        at android.view.Choreographer.doCallbacks(Choreographer.java:723)
        at android.view.Choreographer.doFrame(Choreographer.java:658)
        at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:897)
        at android.os.Handler.handleCallback(Handler.java:790)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:164)
        at android.app.ActivityThread.main(ActivityThread.java:6494)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)
     Caused by: java.lang.ClassCastException: androidx.constraintlayout.widget.ConstraintLayout cannot be cast to android.widget.TextView
        at android.widget.ArrayAdapter.createViewFromResource(ArrayAdapter.java:424)
        at android.widget.ArrayAdapter.getView(ArrayAdapter.java:407) 
        at android.widget.AbsListView.obtainView(AbsListView.java:2365) 
        at android.widget.ListView.makeAndAddView(ListView.java:2052) 
        at android.widget.ListView.fillDown(ListView.java:786) 
        at android.widget.ListView.fillFromTop(ListView.java:847) 
        at android.widget.ListView.layoutChildren(ListView.java:1826) 
        at android.widget.AbsListView.onLayout(AbsListView.java:2164) 
        at android.view.View.layout(View.java:19659) 
        at android.view.ViewGroup.layout(ViewGroup.java:6075) 
        at androidx.constraintlayout.widget.ConstraintLayout.onLayout(ConstraintLayout.java:1915) 
        at android.view.View.layout(View.java:19659) 
        at android.view.ViewGroup.layout(ViewGroup.java:6075) 
        at android.widget.FrameLayout.layoutChildren(FrameLayout.java:323) 
        at android.widget.FrameLayout.onLayout(FrameLayout.java:261) 
        at android.view.View.layout(View.java:19659) 
        at android.view.ViewGroup.layout(ViewGroup.java:6075) 
        at androidx.appcompat.widget.ActionBarOverlayLayout.onLayout(ActionBarOverlayLayout.java:530) 
        at android.view.View.layout(View.java:19659) 
        at android.view.ViewGroup.layout(ViewGroup.java:6075) 
        at android.widget.FrameLayout.layoutChildren(FrameLayout.java:323) 
        at android.widget.FrameLayout.onLayout(FrameLayout.java:261) 
        at android.view.View.layout(View.java:19659) 
        at android.view.ViewGroup.layout(ViewGroup.java:6075) 
        at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1791) 
        at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1635) 
        at android.widget.LinearLayout.onLayout(LinearLayout.java:1544) 
        at android.view.View.layout(View.java:19659) 
        at android.view.ViewGroup.layout(ViewGroup.java:6075) 
        at android.widget.FrameLayout.layoutChildren(FrameLayout.java:323) 
        at android.widget.FrameLayout.onLayout(FrameLayout.java:261) 
        at com.android.internal.policy.DecorView.onLayout(DecorView.java:761) 
        at android.view.View.layout(View.java:19659) 
        at android.view.ViewGroup.layout(ViewGroup.java:6075) 
        at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:2496) 
        at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2212) 
        at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1392) 
        at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6752) 
        at android.view.Choreographer$CallbackRecord.run(Choreographer.java:911) 
        at android.view.Choreographer.doCallbacks(Choreographer.java:723) 
        at android.view.Choreographer.doFrame(Choreographer.java:658) 
        at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:897) 
        at android.os.Handler.handleCallback(Handler.java:790) 
        at android.os.Handler.dispatchMessage(Handler.java:99) 
        at android.os.Looper.loop(Looper.java:164) 
        at android.app.ActivityThread.main(ActivityThread.java:6494) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)