在android studio中显示数据从数据库中的列表视图
所以我试图创建一个数据库和数据正在保存在数据库中,但我想获得主要活动列表视图中的数据,所以我试着在这里的主要活动在android studio中显示数据从数据库中的列表视图
import android.content.Intent;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.support.design.widget.FloatingActionButton;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.Toast;
import java.util.ArrayList;
import java.util.List;
import static com.frolicfreak.bhushan.memo.DatabaseHelper.Table_Name;
public class MainActivity extends AppCompatActivity implements View.OnClickListener{
FloatingActionButton fab;
DatabaseHelper db;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
db =new DatabaseHelper(this);
fab= (FloatingActionButton)findViewById(R.id.fab);
fab.setOnClickListener(this);
ListView listView = (ListView)findViewById(R.id.list);
ArrayList<String> theList =new ArrayList<>();
Cursor data= db.getAllData();
if (data.getCount()==0){
return;
}
else
{
while(data.moveToNext()){
theList.add(getString(1));
ListAdapter listAdapter=new ArrayAdapter<>(this,android.R.layout.simple_list_item_1,theList);
listView.setAdapter(listAdapter);
}
}
}
@Override
public void onClick(View v) {
Intent intent= new Intent(this,Main2Activity.class);
startActivity(intent);
}
}
现在我执行这个活动并没有在Android显示器
08-25 02:13:23.179 4125-4125/com.frolicfreak.bhushan.memo E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.frolicfreak.bhushan.memo, PID: 4125
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.frolicfreak.bhushan.memo/com.frolicfreak.bhushan.memo.MainActivity}: android.content.res.Resources$NotFoundException: String resource ID #0x1
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2416)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476)
at android.app.ActivityThread.-wrap11(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5417)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
Caused by: android.content.res.Resources$NotFoundException: String resource ID #0x1
at android.content.res.Resources.getText(Resources.java:312)
at android.content.res.Resources.getString(Resources.java:400)
at android.content.Context.getString(Context.java:409)
at com.frolicfreak.bhushan.memo.MainActivity.onCreate(MainActivity.java:47)
at android.app.Activity.performCreate(Activity.java:6237)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1107)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2369)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476)
at android.app.ActivityThread.-wrap11(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5417)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
错误该应用程序是越来越主发射活动 甚至崩溃,所以请帮我解决这个问题
是数据库的辅助文件扩展 DatabaseHelper的java文件如下
package com.frolicfreak.bhushan.memo;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import java.util.ArrayList;
/**
* Created by BHUSHAN on 24-08-2017.
*/
public class DatabaseHelper extends SQLiteOpenHelper {
public static final String Database_Name = "Memo.db";
public static final String Table_Name = "Memo";
public static final String col1 = "ID";
public static final String col2 = "data";
public DatabaseHelper(Context context) {
super(context, Database_Name, null, 1);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("create table " + Table_Name + "(ID integer primary key autoincrement, data text)");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("drop table if exists " + Table_Name);
onCreate(db);
}
public boolean insertData(String data, String Data) {
SQLiteDatabase db = this.getWritableDatabase();
ContentValues contentValues = new ContentValues();
contentValues.put(col2, Data);
long result = db.insert(Table_Name, null, contentValues);
if (result==-1)
return false;
else
return true;
}
public Cursor getAllData() {
SQLiteDatabase db = this.getWritableDatabase();
Cursor res = db.rawQuery("SELECT * FROM " + Table_Name, null);
return res;
}
}
第一次尝试编辑代码
theList.add(getString(1))
的线theList.add(data.getString(1))
如果在此之后它不工作,给你更多的代码DBhelper类。
嘿谢谢你哟它的工作 现在你能解释为什么它没有帮助? –
请接受我的回答(点击我的回答)。因为你应该调用你的游标数据实例的索引而不是索引。这里“theList.add(getString(1));”你waner添加对象从游标数据实例知道对象的索引,所以你应该参考你的游标数据实例中的对象的索引)..就像“data.getString(1)” –
我没有点击你的答案我实际上新点击这里 我点击箭头 下面的刻度线,谢谢你解释 –
这是由于应用程序无法找到具有给定ID的任何字符串资源而引起的。您需要给予字符串资源ID,而不是任何像1那样的随机整数,因为您已给出theList.add(getString(1));
谢谢你指出它 我用 替换它theList.add(data.getString(1)); –
您遇到的一个问题是您正在创建适配器,然后为每次迭代设置ListView的适配器,您应该只在阵列完全构建时创建一次ListAdpater,同样,您应该只设置适配器一次。
你并不需要使用ListAdapter你可以用它简化事项,例如一个CursorAdapter: -
Cursor data= db.getAllData();
SimpleCursorAdapter sca = new SimpleCursorAdapter(this,
android.R.layout.simple_list_item_1,
data,
new String[]{data.getColumnname(1)},
new int[]{android.R.id.text1}, 0);
listview.setAdapter(sca);
注意一个CursorAdapter需要一个叫做_id列,因此上述可能需要确保它确实。
以上可以取代: -
ArrayList<String> theList =new ArrayList<>();
Cursor data= db.getAllData();
if (data.getCount()==0){
return;
}
else
{
while(data.moveToNext()){
theList.add(getString(1));
ListAdapter listAdapter=new ArrayAdapter<>(this,android.R.layout.simple_list_item_1,theList);
listView.setAdapter(listAdapter);
}
}
附:未经测试,因此可能会出现一些错误。
注意!完成后应关闭游标。所以我建议使用onDestroy
方法来关闭游标,例如
@Override
public void onDestroy() {
super.onDestroy();
data.close();
}
或者使用一个中间数组,那么你可以使用: -
ArrayList<String> theList = new ArrayList<>();
Cursor data= db.getAllData();
while (data.moveToNext()) {
theList.add(data.getString(1));
}
ListAdapter listadpater = new ArrayAdapter<String>(this,
android.R.layout.simple_list_item_1,
theList
);
listview.setAdapter(listadpater);
注意!这假设您的光标至少有2列,因为getString(1)
实际上是从第二列中获取数据。
它正在工作的人,但现在当我保存时,数据并没有立即更新,当我回去时,新的数据添加不显示,但是当我再次打开应用程序数据更新 如何做到这一点? 我应该上传哪些文件,如果有什么遗漏
是DatabaseHelper扩展SQLiteOpenHelper ??如果是的话编辑该问题添加更多代码! – Xenolion
另外,请告诉我们第47行。 – jdv
yes DatabaseHelper扩展 –