Sqlite 在android studio中将数据库中的行打印到列表视图中
我知道在堆栈溢出上已经有了这个问题的答案,但是在尝试了那里的答案之后,我似乎仍然无法解决这个问题。 我正在尝试将数据库中的行显示到列表视图中。 我能够在文本视图中显示行,现在我正在尝试将其转换为列表视图 以下是sqllite代码的示例: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
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)