【问题标题】:showing data in listview from database in android studio在 android studio 的数据库中显示列表视图中的数据
【发布时间】:2017-08-24 21:01:07
【问题描述】:

所以我尝试创建一个数据库,并且数据正在保存在数据库中,但我想在 mainactivity 的列表视图中获取数据,所以我在这里尝试了 Main Activity

 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;
}

}

【问题讨论】:

  • DatabaseHelper 是否扩展了 SQLiteOpenHelper?如果是 编辑问题添加更多代码!
  • 另外,告诉我们第 47 行在哪里。
  • 是的 DatabaseHelper 已扩展
  • 为什么是第 47 行?第 47 行有错误吗?在哪个班?

标签: android database sqlite listview


【解决方案1】:

首先尝试编辑代码行

theList.add(getString(1))theList.add(data.getString(1))

如果之后它不起作用,请提供更多 DBhelper 类的代码。

【讨论】:

  • 嘿,非常感谢,它现在起作用了,你能解释一下为什么它没有帮助吗?
  • 请接受我的回答。(点击我的回答)。因为您不仅应该调用索引,还应该调用光标数据实例的索引。这里“ theList.add(getString(1));”您希望从 Cursor 数据实例中添加对象,知道对象的索引,因此您应该参考 Cursor 数据实例中的对象索引).. 像“data.getString(1)”
  • 我确实点击了你的答案我实际上是新来的我点击了箭头下方的勾号谢谢你的解释
【解决方案2】:

这是因为应用程序无法找到具有给定 ID 的任何字符串资源。您需要提供字符串资源 ID,而不是您给定的任何随机整数,如 1 theList.add(getString(1));

【讨论】:

  • 感谢您指出,我将其替换为 theList.add(data.getString(1));
【解决方案3】:

您遇到的一个问题是您正在创建一个适配器,然后为每次迭代设置 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);

注意!这假设您的 Cursor 至少有 2 列,因为 getString(1) 实际上是在说从第 2 列获取数据。

【讨论】:

    【解决方案4】:

    它正在工作,但是现在当我保存它时,当我返回时,数据不会立即更新,然后添加的新数据不会显示,但是当我再次打开应用程序时,数据会更新 怎么做? 如果缺少任何文件,我应该上传哪个文件

    【讨论】:

      猜你喜欢
      • 2013-02-15
      • 1970-01-01
      • 1970-01-01
      • 2019-02-10
      • 1970-01-01
      • 2018-01-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多