将 sqlite 数据库中的数据显示到片段 activity 中的列表视图中
Displaying data from sqlite database into listview in fragment activity
作为 android 开发的新手,我已经在这个问题上停留了几个星期了,它变得非常累人。
在查看了每个教程并阅读了我能找到的每个问题和答案之后,我仍然无法弄清楚如何让 Android Studio 只获取我的 SQLite 数据库中的内容并将其内容粘贴到列表显示。我想将我的数据库 (All_wine.db) 中的所有数据显示到我的列表视图 (listwine) 中。我的应用程序通常使用 android studio 构建,但应用程序崩溃了,不幸的是 Myapplication
已停止氮氧化物
这是我的代码:
DatabaseHelper.java
package com.example.myapplication;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.DatabaseErrorHandler;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
public class DatabaseHelper extends SQLiteOpenHelper {
private static final String DB_NAME = "All_wine.db";
private static final String DB_TABLE = "All_wine_Table";
//columns
private static final String ID = "ID";
private static final String NAME ="NAME";
private static final String CREATE_TABLE ="CREATE TABLE "+DB_TABLE+" ("+
ID + " INTEGER PRIMARY KEY AUTOINCREMENT, "+
NAME+ " TEXT "+ ")";
public DatabaseHelper(Context context) {
super(context,DB_NAME ,null,1);
}
public DatabaseHelper(Context context, String name, SQLiteDatabase.CursorFactory factoty, int version) {
super(context,DB_NAME ,null,1);
}
public DatabaseHelper(Context context, String name, SQLiteDatabase.CursorFactory factoty, int version, DatabaseErrorHandler errorHandler) {
super(context,DB_NAME ,null,1);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("CREATE TABLE IF NOT EXISTS " +DB_TABLE + "(ID INTEGER PRIMARY KEY AUTOINCREMENT,NAME TEXT)");
db.execSQL("INSERT INTO " +DB_TABLE + "(NAME) VALUES ('Mοσχατο ελληνικο ')");
db.execSQL("INSERT INTO " +DB_TABLE + "(NAME) VALUES ('Vin Dux')");
}
@Override
public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i ,int i1) {
sqLiteDatabase.execSQL("DROP TABLE IF EXISTS "+ DB_TABLE);
onCreate(sqLiteDatabase);
}
public void insertinallwine(String namewine){
SQLiteDatabase sqLiteDatabase = this.getWritableDatabase();
ContentValues contentValues = new ContentValues();
contentValues.put(NAME,namewine);
sqLiteDatabase.insert(DB_TABLE,null,contentValues);
}
//create method to view data
public Cursor viewData(){
SQLiteDatabase db = this.getReadableDatabase();
String query = "Select * from " + DB_TABLE;
Cursor cursor = db.rawQuery(query, null);
return cursor;
}
}
Home_Fragment.java
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Toast;
import java.util.ArrayList;
import java.util.Arrays;
import static com.facebook.FacebookSdk.getApplicationContext;
public class Home_Fragment extends Fragment {
DatabaseHelper db ;
ArrayList<String> listItem;
ArrayAdapter adapter;
ListView listwine;
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view=inflater.inflate(R.layout.fragment_home, container, false);
// db = new DatabaseHelper(getActivity(),"All_wine.db",null,1);
db = new DatabaseHelper(getContext());
listItem=new ArrayList<>();
listwine=(ListView)getActivity().findViewById(R.id.wine_list);
db.insertinallwine("Samos Grand Cru");
viewData();
return view;
}
private void viewData(){
Cursor cursor=db.viewData();
if(cursor.getCount() == 0) {
Toast.makeText(getContext(),"No data to show",Toast.LENGTH_LONG).show();
}else{
while (cursor.moveToNext()){
listItem.add(cursor.getString(1)); //index 1 is name index 0 is id
}
}
adapter = new ArrayAdapter(getContext(),android.R.layout.simple_list_item_1,listItem);
listwine.setAdapter(adapter);
}
}
fragment_home.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/eoss_samou">
<ListView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"
android:id="@+id/wine_list"
tools:ignore="InvalidId"/>
</RelativeLayout>
我确定我遗漏了一些非常愚蠢的东西,但我们将不胜感激。
我注意到您的代码有些奇怪。这可能是问题所在。
您的 wine_list(ListView) 在您的片段中,但您正试图从您的 activity.
访问它
尝试替换
listwine=(ListView)getActivity().findViewById(R.id.wine_list);
和
listwine=(ListView)view.findViewById(R.id.wine_list);
作为 android 开发的新手,我已经在这个问题上停留了几个星期了,它变得非常累人。
在查看了每个教程并阅读了我能找到的每个问题和答案之后,我仍然无法弄清楚如何让 Android Studio 只获取我的 SQLite 数据库中的内容并将其内容粘贴到列表显示。我想将我的数据库 (All_wine.db) 中的所有数据显示到我的列表视图 (listwine) 中。我的应用程序通常使用 android studio 构建,但应用程序崩溃了,不幸的是 Myapplication
已停止氮氧化物
这是我的代码:
DatabaseHelper.java
package com.example.myapplication;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.DatabaseErrorHandler;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
public class DatabaseHelper extends SQLiteOpenHelper {
private static final String DB_NAME = "All_wine.db";
private static final String DB_TABLE = "All_wine_Table";
//columns
private static final String ID = "ID";
private static final String NAME ="NAME";
private static final String CREATE_TABLE ="CREATE TABLE "+DB_TABLE+" ("+
ID + " INTEGER PRIMARY KEY AUTOINCREMENT, "+
NAME+ " TEXT "+ ")";
public DatabaseHelper(Context context) {
super(context,DB_NAME ,null,1);
}
public DatabaseHelper(Context context, String name, SQLiteDatabase.CursorFactory factoty, int version) {
super(context,DB_NAME ,null,1);
}
public DatabaseHelper(Context context, String name, SQLiteDatabase.CursorFactory factoty, int version, DatabaseErrorHandler errorHandler) {
super(context,DB_NAME ,null,1);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("CREATE TABLE IF NOT EXISTS " +DB_TABLE + "(ID INTEGER PRIMARY KEY AUTOINCREMENT,NAME TEXT)");
db.execSQL("INSERT INTO " +DB_TABLE + "(NAME) VALUES ('Mοσχατο ελληνικο ')");
db.execSQL("INSERT INTO " +DB_TABLE + "(NAME) VALUES ('Vin Dux')");
}
@Override
public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i ,int i1) {
sqLiteDatabase.execSQL("DROP TABLE IF EXISTS "+ DB_TABLE);
onCreate(sqLiteDatabase);
}
public void insertinallwine(String namewine){
SQLiteDatabase sqLiteDatabase = this.getWritableDatabase();
ContentValues contentValues = new ContentValues();
contentValues.put(NAME,namewine);
sqLiteDatabase.insert(DB_TABLE,null,contentValues);
}
//create method to view data
public Cursor viewData(){
SQLiteDatabase db = this.getReadableDatabase();
String query = "Select * from " + DB_TABLE;
Cursor cursor = db.rawQuery(query, null);
return cursor;
}
}
Home_Fragment.java
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Toast;
import java.util.ArrayList;
import java.util.Arrays;
import static com.facebook.FacebookSdk.getApplicationContext;
public class Home_Fragment extends Fragment {
DatabaseHelper db ;
ArrayList<String> listItem;
ArrayAdapter adapter;
ListView listwine;
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view=inflater.inflate(R.layout.fragment_home, container, false);
// db = new DatabaseHelper(getActivity(),"All_wine.db",null,1);
db = new DatabaseHelper(getContext());
listItem=new ArrayList<>();
listwine=(ListView)getActivity().findViewById(R.id.wine_list);
db.insertinallwine("Samos Grand Cru");
viewData();
return view;
}
private void viewData(){
Cursor cursor=db.viewData();
if(cursor.getCount() == 0) {
Toast.makeText(getContext(),"No data to show",Toast.LENGTH_LONG).show();
}else{
while (cursor.moveToNext()){
listItem.add(cursor.getString(1)); //index 1 is name index 0 is id
}
}
adapter = new ArrayAdapter(getContext(),android.R.layout.simple_list_item_1,listItem);
listwine.setAdapter(adapter);
}
}
fragment_home.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/eoss_samou">
<ListView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"
android:id="@+id/wine_list"
tools:ignore="InvalidId"/>
</RelativeLayout>
我确定我遗漏了一些非常愚蠢的东西,但我们将不胜感激。
我注意到您的代码有些奇怪。这可能是问题所在。
您的 wine_list(ListView) 在您的片段中,但您正试图从您的 activity.
访问它尝试替换
listwine=(ListView)getActivity().findViewById(R.id.wine_list);
和
listwine=(ListView)view.findViewById(R.id.wine_list);