【问题标题】:Fetching SQLite Data Using Order By DateTime But Not Work使用按日期时间排序但不起作用的获取 SQLite 数据
【发布时间】:2018-04-04 17:39:13
【问题描述】:

我想获取所有数据(日期和时间),但这对我没有帮助,也不要显示任何错误

点击以下链接,但这对我没有帮助:

将记录插入SQLite 数据库:

private String getDateTime() {
    SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy hh:mm a");
    Date date = new Date();
    return dateFormat.format(date);
}

public long insertCompany(Company company){
    //String sql = null;
    SQLiteDatabase db = dbHelper.getWritableDatabase();

    ContentValues values = new ContentValues();
    values.put(DatabaseHelper.KEY_COMPANY_NAME, company.getName());
    values.put(DatabaseHelper.KEY_CREATED_AT, getDateTime());
    values.put(DatabaseHelper.KEY_COMPANY_WEBSITE,company.getWebsite());
    values.put(DatabaseHelper.KEY_COMPANY_EMAIL,company.getEmail());
    values.put(DatabaseHelper.KEY_COMPANY_PHONE_HOME,company.getPhoneHome());
    values.put(DatabaseHelper.KEY_COMPANY_PHONE_PRIMARY,company.getPhonePrimary());
    values.put(DatabaseHelper.KEY_COMPANY_ADDRESS,company.getAddressLine1());
    long company_id = db.insert(COMPANY, null, values);

    return company_id;
}

下面的代码是我将在我的数据库中实现但它无法工作:

List<Company> companyList = new ArrayList<Company>();
String selectQuery = "SELECT  * FROM " + COMPANY + " ORDER BY (" + KEY_CREATED_AT + ") ";

Log.e(TAG, selectQuery);

SQLiteDatabase db = dbHelper.getReadableDatabase();
Cursor c = db.rawQuery(selectQuery, null);

完整代码:

public List<Company> getAllCompany(){

    List<Company> companyList = new ArrayList<Company>();
    String selectQuery = "SELECT  * FROM " + COMPANY + " ORDER BY (" + KEY_CREATED_AT + ") ";

    Log.e(TAG, selectQuery);

    SQLiteDatabase db = dbHelper.getReadableDatabase();
    Cursor c = db.rawQuery(selectQuery, null);

    if (c.moveToFirst()) {
        do {
            Company com = new Company();
            com.setId(c.getInt(c.getColumnIndex(KEY_ID)));
            com.setName(c.getString(c.getColumnIndex(KEY_COMPANY_NAME)));
            com.setWebsite(c.getString(c.getColumnIndex(KEY_COMPANY_WEBSITE)));
            com.setEmail(c.getString(c.getColumnIndex(KEY_COMPANY_EMAIL)));
            com.setPhoneHome(c.getString(c.getColumnIndex(KEY_COMPANY_PHONE_HOME)));
            com.setPhonePrimary(c.getString(c.getColumnIndex(KEY_COMPANY_PHONE_PRIMARY)));
            com.setAddressLine1(c.getString(c.getColumnIndex(KEY_COMPANY_ADDRESS)));
            com.setDate(c.getString(c.getColumnIndex(KEY_CREATED_AT)));
            //com.setDate(c.getString(c.getColumnIndex(KEY_UPDATED_AT)));
            companyList.add(com);
        } while (c.moveToNext());
    }

    return companyList;
}

请参阅下图了解电池数据未按日期和时间显示:

帮帮我:)

提前致谢

【问题讨论】:

  • 你想要最新的优先吗?
  • 是的@NiranjPatel
  • field desc 订购
  • 它不起作用,使用毫秒而不是日期字符串或使用日期时间数据类型。
  • 您必须更改在数据库中存储值的格式,存储毫秒的日期或 yyyymmddhhMMss。

标签: java android sqlite


【解决方案1】:

在对数据进行排序时,VARCHAR 不适用于日期。您可以在视图中显示时在数据库中插入毫秒并格式化日期。

insertCompany 方法中替换这一行。

values.put(DatabaseHelper.KEY_CREATED_AT, System.currentTimeMillis());

在从 DB 获取数据时替换此行。

long time = Long.parseLong(c.getString(c.getColumnIndex(KEY_CREATED_AT)));
com.setDate(getFromatDate(time));

从毫秒开始格式化数据的方法。

public String getFromatDate(long dateTime) {
    String formatedDate;
    Calendar calendar = Calendar.getInstance();
    calendar.setTimeInMillis(dateTime);
    Date mDate = calendar.getTime();
    SimpleDateFormat sdf = new SimpleDateFormat("dd-MM-yyyy hh:mm a", new Locale("en"));
    formatedDate = sdf.format(mDate);
    return formatedDate;
}

您也可以在查询末尾添加 DESC 参见以下代码:

String selectQuery = "SELECT  * FROM " + COMPANY + " ORDER BY (" + KEY_CREATED_AT + ") DESC " ;

【讨论】:

  • 我可以更改选择数据的查询吗?
  • 不需要,如果不工作那么你可以在行尾添加 DESC
  • 非常感谢我的兄弟,它就像 Charm @Niraj Patel 一样工作
  • 兄弟你能再给我1个建议如果我更新任何数据,那么它会在日期时间明智地检索数据 ?? @NirajPatel
  • 您也可以在更新数据时更新 KEY_CREATED_AT
【解决方案2】:

这是完整的实现示例。

如果 KEY_CREATED_AT 是 char 或 varchar 而不是日期,否则您可以简单地使用 order by 子句就可以了。

您可以使用 CONVERT 将值更改为日期并按该日期排序

SELECT * 
FROM 
     COMPANY
ORDER BY 
   CONVERT(DateTime, KEY_CREATED_AT ,101)  DESC

问题在于,正如 Sparky 在 cmets 中指出的那样,如果 KEY_CREATED_AT 的值无法转换为查询不会执行的日期。

这意味着您应该排除坏行或让坏行放在结果的底部

要排除坏行,只需添加 WHERE IsDate(KEY_CREATED_AT ) = 1

要让糟糕的日期浮出水面,您需要使用 CASE

例如

ORDER BY 
    CASE
       WHEN IsDate(KEY_CREATED_AT) = 1 THEN CONVERT(DateTime,KEY_CREATED_AT,101)
       ELSE null
    END DESC

【讨论】:

  • 我想获取所有数据,而不是任何单个数据或选定数据
  • 使用时间戳过滤日期是最好的方法
  • 您可以使用 order by CONVERT(datetime, EventDate ) desc 来处理所有文件
  • 什么是 EventDate ? @krishankTripathi
  • 只需传递您的变量,即 KEY_CREATED_DATE 具有字符串中的日期值或 varchar 代替 Eventdate。
【解决方案3】:

您在 order by 子句中缺少查询的“顺序”

String selectQuery = "SELECT  * FROM " + COMPANY + " ORDER BY (" + KEY_CREATED_AT + " DESC)";

您可以根据需要使用 ASC 或 DESC。

【讨论】:

  • 我也试试这个,但对我没用
  • 非常感谢您的建议,但是在我开始写答案时没有制作任何 cmets
猜你喜欢
  • 1970-01-01
  • 2018-04-17
  • 1970-01-01
  • 1970-01-01
  • 2021-04-22
  • 2017-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多