繁体   English   中英

为什么我的列表项没有显示在 listView 上

[英]Why my list items not being displayed on listView

我创建了一个列表视图,我想从 sqlite 数据库中检索项目。 因此,我创建了一个名为getrequestitems的 List 方法,我将在其中映射详细信息并添加到 arraylist。

public List<Map<String, String>> getrequestitems()   {
        List<Map<String, String>> data = null;


       data = new ArrayList<Map<String, String>>();
        try {
            SQLiteDatabase db = dbHandler.getReadableDatabase();
            String sql = "SELECT * from request WHERE time > date('now','-1 day')";
            Cursor rs = db.rawQuery(sql,null);
            if(rs.moveToFirst()) {
                do {
                    Map<String, String> dtname = new HashMap<String, String>();
                    dtname.put("bloodgrp", rs.getString(rs.getColumnIndex("bloodgrp")));
                    dtname.put("date", "Date:- " + rs.getString(rs.getColumnIndex("Datetime1")));
                    dtname.put("time", "Time:- " + rs.getString(rs.getColumnIndex("time")));
                    dtname.put("name", "Name:- " + rs.getString(rs.getColumnIndex("Name")));
                    dtname.put("Username", rs.getString(rs.getColumnIndex("Username")));
                    data.add(dtname);
                }
                while (rs.moveToNext());

            }
        } catch (Exception e) {
            Toast.makeText(getApplicationContext(), e.getMessage(), Toast.LENGTH_SHORT).show();
        }
        return data;
    }

但是当我打开该活动时,它没有显示任何记录。 我已经调试了代码,但不能有任何异常。 我写错了查询? as "SELECT * from request WHERE time > date('now','-1 day')"; 这是我的完整代码。

public class request extends AppCompatActivity {

    SimpleAdapter ad;
    TextView list3;
      private SlidrInterface slidr;
      private DBHandler dbHandler;
      private static ArrayList<String> arrayList = new ArrayList<>();

     @RequiresApi(api = Build.VERSION_CODES.N)
     @Override
    protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         setContentView(R.layout.activity_request);
         slidr = Slidr.attach(this);
         slidr.unlock();
         dbHandler = new DBHandler(this);
       
         list3 = findViewById(R.id.list3);
    
         TextView txt = findViewById(R.id.list4);

         ListView lst1 = (ListView) findViewById(R.id.list2);
         List<Map<String, String>> MyDataList = null;
          MyDataList = getrequestitems();
         String[] from = {"bloodgrp", "date", "time", "name", "Username"};
         int[] to = {R.id.listt, R.id.date, R.id.time1, R.id.name3, R.id.user};
         ad = new SimpleAdapter(request.this, MyDataList, R.layout.listrequest, from, to);
          lst1.setAdapter(ad);
       

         lst1.setOnItemClickListener(new AdapterView.OnItemClickListener() {
             @Override
             public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
                  List<Map<String, String>> MyDataList1 = null;
                  MyDataList1 = getrequestitems();
                 String[] from = {"Username"};
                 int[] to = {R.id.user};
                 Toast.makeText(getApplicationContext(), MyDataList1.toString(), Toast.LENGTH_SHORT).show();
                 ad = new SimpleAdapter(request.this, MyDataList1, R.layout.listrequest, from, to);
                 if(ad.getCount()==0){
                     Toast.makeText(getApplicationContext(), "No requests are currently visible", Toast.LENGTH_SHORT).show();
                 }
                 HashMap<String, String> obj = (HashMap<String, String>) ad.getItem(i);
                 String name = (String) obj.get("Username");

                 try {
                     SQLiteDatabase db = dbHandler.getReadableDatabase();
                     String sql = "select * from request where Username = '" + name + "'";
                     Cursor rs = db.rawQuery(sql,null);
                     if (rs.moveToFirst()) {
                         do {
                             runOnUiThread(new Runnable() {
                                 @SuppressLint("Range")
                                 @Override
                                 public void run() {
                                     try {

                                         final AlertDialog.Builder alert = new AlertDialog.Builder(request.this);
                                         View mView = getLayoutInflater().inflate(R.layout.custom_dialog3, null);
                                         final TextView txt_inputText = (TextView) mView.findViewById(R.id.name1);
                                         txt_inputText.setText(rs.getString(rs.getColumnIndex("Name")));
                                         final TextView txt_inputText2 = (TextView) mView.findViewById(R.id.contactno1);
                                         txt_inputText2.setText(rs.getString(rs.getColumnIndex("contactNo")));
                                         final TextView txt_inputText3 = (TextView) mView.findViewById(R.id.message1);
                                         txt_inputText3.setText(rs.getString(rs.getColumnIndex("message")));


                                         Button btn_cancel = (Button) mView.findViewById(R.id.btn_cancel);
                                         Button btn_okay = (Button) mView.findViewById(R.id.btn_okay);
                                         alert.setView(mView);
                                         final AlertDialog alertDialog = alert.create();
                                         alertDialog.setCanceledOnTouchOutside(false);
                                         btn_cancel.setOnClickListener(new View.OnClickListener() {
                                             @Override
                                             public void onClick(View v) {
                                                 alertDialog.dismiss();
                                             }
                                         });
                                         btn_okay.setOnClickListener(new View.OnClickListener() {
                                             @Override
                                             public void onClick(View v) {
                                                 String number = txt_inputText2.getText().toString();
                                                 Intent intent = new Intent(Intent.ACTION_DIAL, Uri.parse("tel:" + number));// Initiates the Intent
                                                 startActivity(intent);
                                                 alertDialog.dismiss();
                                             }

                                         });
                                         alertDialog.show();
                                         alertDialog.getWindow().setLayout(730, 850); //Controlling width and height.

                                     } catch (Exception e) {
                                         runOnUiThread(new Runnable() {
                                             public void run() {
                                                 Toast.makeText(getApplicationContext(), e.getMessage(), Toast.LENGTH_LONG).show();
                                             }
                                         });
                                     }
                                 }
                             });

                         }while (rs.moveToNext());
                     }


                 } catch (Exception e) {
                     runOnUiThread(new Runnable() {
                         public void run() {
                           Toast.makeText(getApplicationContext(),e.getMessage(),Toast.LENGTH_LONG).show();
                         }
                     });
                 }

             }
         });

     }
    @SuppressLint("Range")
    public List<Map<String, String>> getrequestitems()   {
        List<Map<String, String>> data = null;


       data = new ArrayList<Map<String, String>>();
        try {
            SQLiteDatabase db = dbHandler.getReadableDatabase();
            String sql = "SELECT * from request WHERE time > date('now','-1 day')";
            Cursor rs = db.rawQuery(sql,null);
            if(rs.moveToFirst()) {
                do {
                    Map<String, String> dtname = new HashMap<String, String>();
                    dtname.put("bloodgrp", rs.getString(rs.getColumnIndex("bloodgrp")));
                    dtname.put("date", "Date:- " + rs.getString(rs.getColumnIndex("Datetime1")));
                    dtname.put("time", "Time:- " + rs.getString(rs.getColumnIndex("time")));
                    dtname.put("name", "Name:- " + rs.getString(rs.getColumnIndex("Name")));
                    dtname.put("Username", rs.getString(rs.getColumnIndex("Username")));
                    data.add(dtname);
                }
                while (rs.moveToNext());

            }
        } catch (Exception e) {
            Toast.makeText(getApplicationContext(), e.getMessage(), Toast.LENGTH_SHORT).show();
        }
        return data;
    }





}

但是当我打开该活动时,它没有显示任何记录。 我已经调试了代码,但不能有任何异常。 我写错了查询?

可能因为您似乎很可能比较轶事的橙子和苹果(请参阅解释/示例),也就是说,您猜测您正在比较时间和日期(请参阅下面的可能修复但这在很大程度上取决于您的实际情况存储在时间列中,请参阅下面的可能的调试操作,这将允许您查看 a) 如果您正在提取任何数据,并且如果应用 get all(无 WHERE 子句)来查看实际的基础数据)

格式为 yyyy-MM-dd –

看到您有一个日期列和一个时间列,这似乎不太可能,或者如果不是浪费的话。

例如,如果时间仅包含时间 hh:mm 甚至 hh:mm:ss,则提取日期将导致意外结果。

考虑以下突出您可能遇到的问题:-

DROP TABLE IF EXISTS request;
CREATE TABLE IF NOT EXISTS request (booldgrp TEXT, Datetime1 TEXT, time TEXT, Name TEXT, Username TEXT);
INSERT INTO request VALUES
    ('O','2023-01-01 10:10','2023-01-01 10:10','FRED','USER001')
    ,('O','2023-01-01 10:10','10:10','FRED','USER002')
    ,('O','2023-01-01 10:10','2023-01-01 23:11','FRED','USER003')
    ,('O','2023-01-01 10:10','23:59','FRED','USER004')
    ,('O','2023-01-01 10:10','21:59','FRED','USER005')
    ,('O','2023-01-01 10:10','22:00','FRED','USER006')
    ,('O','2023-01-01 10:10','20:00','FRED','USER007')
    ,('O','2023-01-01 10:10','20:01','FRED','USER008')
    ,('O','2023-01-01 10:10','19:59:59','FRED','USER009')
;
SELECT *, date('now','-1 day') AS comparedate, time > date('now','-1 day') AS comparison FROM request;
SELECT *, date('now','-1 day') AS comparedate, datetime1 > date('now','-1 day') AS comparison FROM request;
DROP table IF EXISTS request;
  • 你可以在你最喜欢的 SQLite 工具中运行(使用 Navicat)

结果输出(光标中的内容)是:-

在此处输入图像描述

可以看出,如果时间实际上存储为 hh:mm 或 hh:mm:ss (或类似的,你只有时间而不是日期) ,那么前 2 个字符很重要,所以如果当前日期的年份- 1 天是在 21 世纪,只会选择晚上 8 点( 20 :00)或更长的时间。

可能的修复(如果日期列只有日期或日期和时间并且时间列有时间)也许你想要"SELECT * from request WHERE datetime1 > date('now','-1 day')"

可能的调试操作

如果上述方法不能解决您的情况,请考虑将您的代码更改为:-

        SQLiteDatabase db = dbHandler.getReadableDatabase();
        String sql = "SELECT * from request /* WHERE time > date('now','-1 day') */"; // <<<<<<<<<< WHERE clause commented out to get ALL data, try also with WHERE clause */
        Cursor rs = db.rawQuery(sql,null);
        DatabaseUtils.dumpCursor(rs); /* ADDED FOR DEBUG, run and check the LOG */
        if(rs.moveToFirst()) {
  • 看评论

日志将包括类似(提取数据的位置):-

2022-07-19 13:21:50.995 I/System.out: >>>>> Dumping cursor android.database.sqlite.SQLiteCursor@31816bf
2022-07-19 13:21:50.996 I/System.out: 0 {
2022-07-19 13:21:50.996 I/System.out:    bloodgrp=O
2022-07-19 13:21:50.996 I/System.out:    Datetime1=2023-01-01
2022-07-19 13:21:50.996 I/System.out:    time=10:30
2022-07-19 13:21:50.996 I/System.out:    Name=FRED
2022-07-19 13:21:50.996 I/System.out:    Username=USER001
2022-07-19 13:21:50.996 I/System.out: }
2022-07-19 13:21:50.996 I/System.out: <<<<<

或(未提取数据的情况下):-

2022-07-19 13:24:12.216 I/System.out: >>>>> Dumping cursor android.database.sqlite.SQLiteCursor@30380ea
2022-07-19 13:24:12.217 I/System.out: <<<<<

笔记

getColumnIndex索引方法是区分大小写的(或至少是区分大小写的),因此如果任何列名不匹配,即使只是由于大小写,那么捕获的异常行 0 列 -1也将不产生任何结果(仅一会儿用吐司注意到这一点)。 我会建议:-

  • 使用常量作为列名,并且总是使用这些常量来引用列名,即每个列名只硬编码一次。 不正确的变量名称将无法编译。 编码不正确的列名将很容易编译并且可能不会被注意到。

  • 考虑使用e.printStackTrace()以及甚至代替 Toast

    • 捕获和捕获 SQLite 错误可以很容易地掩盖问题


例子



根据您的代码,但使用:-

  • DBhandler和布局由可以从您的代码中收集到的内容和

  • 在创建数据库时插入一行:-

     public void onCreate(SQLiteDatabase db) { db.execSQL("CREATE TABLE IF NOT EXISTS " + TABLE_NAME + "(" + REQUEST_COLUMN_BLOODGROUP + " TEXT" + "," + REQUEST_COLUMN_DATE + " TEXT" + "," + REQUEST_COLUMN_TIME + " TEXT" + "," + REQUEST_COLUMN_NAME + " TEXT " + "," + REQUEST_COLUMN_USERNAME + " TEXT" + "," + REQUEST_COLUMN_CONTACTNo + " TEXT" + "," + REQUEST_COLUMN_MESSAGE + " TEXT" + ")"); ContentValues cv = new ContentValues(); cv.put(REQUEST_COLUMN_BLOODGROUP,"O"); cv.put(REQUEST_COLUMN_DATE,"2023-01-01"); cv.put(REQUEST_COLUMN_TIME,"10:30"); cv.put(REQUEST_COLUMN_NAME,"FRED"); cv.put(REQUEST_COLUMN_USERNAME,"USER001"); cv.put(REQUEST_COLUMN_CONTACTNo,"0000000000"); cv.put(REQUEST_COLUMN_MESSAGE,"MESSAGE X"); db.insert(TABLE_NAME,null,cv); }
  • 使用 Request(更改为大写)Activity 直接从 MainActivity 启动

  • 并将可能的修复应用于 WHERE 子句(即用于比较的日期时间列而不是时间列)

  • 带有青色背景的 ListView(为了区分它)

然后在运行时:-

在此处输入图像描述

然后当单击该项目时:-

在此处输入图像描述

如果单击确定:-

在此处输入图像描述

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM