3

Mac OS-X

アンドロイド

ADT を使用した Eclipse

SQLite

私は Android アプリを作成するのが初めてで、これを徹底的に調査しましたが、どこにも行きません。SQLite データベースにクエリを実行して、2 つの日付の間のすべての行を返す必要があります。これまでの調査から学んだことは、Android の SQLite データベースには DateTime 列がなく、テキスト列として保存する必要があるということです。しかし、問題は文字列を比較しようとすることにあると思いますが、それを回避する方法がわかりません。これが私のコードです:

DB = currentContext.openOrCreateDatabase(DBName, 0, null);
DB.execSQL("CREATE TABLE IF NOT EXISTS " + tableName + " (ID INTEGER PRIMARY KEY AUTOINCREMENT, Date VARCHAR(40), Hours INT(3));");

エラーは発生していませんが、RawQuery から結果が返されません。これが私のコードです:

Cursor c = newDB.rawQuery("select ID, Date, Hours from " + tableName + " where Date BETWEEN '" + date1 + " 00:00:00' AND '" + date2 + " 99:99:99'", null);

if (c != null ) {
  Log.d(TAG, "date1: "+date1);
  Log.d(TAG, "date2: "+date2);
  if  (c.moveToFirst()) {
     do {
        int id = c.getInt(c.getColumnIndex("ID"));
        String date1 = c.getString(c.getColumnIndex("Date"));
        int hours1 = c.getInt(c.getColumnIndex("Hours"));
        results.add(+ id + "    Date: " + date1 + "    Hours: " + hours1);
     }
         while (c.moveToNext());
      }
}

次のステートメントも試しましたが、どちらも結果が得られません。

Cursor c = newDB.rawQuery("select ID, Date, Hours from " + tableName + " where Date BETWEEN " + Date(date1) + " AND " + Date(date2) + "", null);

他の StackOverflow の回答からこのステートメントを取得しましたが、date() メソッドに関するドキュメントが見つかりません。現在廃止されているかどうかはわかりませんが、「Date(String) method is undefined for the type (classname)」というエラーが表示され、いくつかの Java ライブラリをインポートしようとしました。

選択した日付間の行を取得する rawData() クエリを作成する正しい方法を知っている人はいますか??

詳細情報、これらは私のINSERTステートメントとデータベースに入る日付形式です:

newDB.execSQL("INSERT INTO " + tableName + " (Date, Hours) Values ('" + ph_date + "'," + hours + ");");
String date1 = "12/1/13"
String date2 = "25/1/13"
4

4 に答える 4

7

さて、文字列の日付を機能させることができなかったので、文字列の日付をカレンダーの日付からUnix時間に変換してからSQLiteデータベースに追加し、表示するときに元に戻す(Unix時間からカレンダーの日付から文字列)必要がありました。Unix Time では、日付列に対して計算 (並べ替え、昇順、並べ替えなど) を実行できます。これは、長時間の試行錯誤の後で使用するのに最適な方法です。最終的に使用したコードは次のとおりです。

Cursor c = newDB.rawQuery("select ID, Date, Hours from " + tableName + " where Date BETWEEN '" + startDateQueryDate + "' AND '" + endDateQueryDate + "' ORDER BY Date ASC", null);

            if (c != null ) {
                if  (c.moveToFirst()) {
                    do {
                        int tempId = c.getInt(c.getColumnIndex("ID"));
                        long tempUnixTime = c.getLong(c.getColumnIndex("Date"));

                        //convert tempUnixTime to Date
                        java.util.Date startDateDate = new java.util.Date(tempUnixTime);

                        //create SimpleDateFormat formatter
                        SimpleDateFormat formatter1;
                        formatter1 = new SimpleDateFormat("dd/MM/yyyy", Locale.UK);

                        //convert Date to SimpleDateFormat and convert to String
                        String tempStringStartDate = formatter1.format(startDateDate);

                        int tempHours = c.getInt(c.getColumnIndex("Hours"));
                        results.add(+ tempId + "    Date: " + tempStringStartDate + "    Hours: " + tempHours);
                    }while (c.moveToNext());
                }
            }
于 2013-01-11T01:27:53.890 に答える
6

SQLite が理解できる形式で日付値を保存する必要があります。単純な日付の場合、これはYYYY-MM-DD文字列、秒の値、またはユリウス日付の数値になります。

日付を文字列としてフォーマットするには、次のようなものを使用します。

Date date1 = ...;
DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
String dateAsString = df.format(date1);

日付を秒の値としてフォーマットするには、戻り値をDate.getTime()1000 で割ります。


日付変数がすでに文字列である場合は、正しい形式であることを確認する必要があります。

日付文字列にフォーマットがない場合yyyy-MM-dd、SQLite の日付関数はそれらを理解せず、比較は機能しません (文字列は最上位フィールドである年で始まる必要があり、すべてのフィールドは固定長でなければならないため、文字列は比較は正しくなります)。

于 2013-01-08T09:17:13.417 に答える
4

の上位 2 名を 2 日間取得しています

Calendar cal = Calendar.getInstance();
            Date now = new Date();
            cal.setTime(now);
            String currentDate = sdf.format(cal.getTimeInMillis());
            cal.add(Calendar.DAY_OF_YEAR, -1);
            String previusdDate = sdf.format(cal.getTimeInMillis());

            Log.e("Start date", currentDate);
            Log.e("End date", previusdDate);
            SQLiteOpenHelper helper;
            SQLiteDatabase db;
            helper = new My_SQliteHelper(mContext, "MyDB", null, 1);
            db = helper.getWritableDatabase();

            Cursor cr = db.rawQuery("SELECT name,sum(minutes),date FROM Historyinfo WHERE date BETWEEN '" + previusdDate + "' AND '" + currentDate + "' GROUP BY name ORDER BY SUM(minutes) DESC LIMIT 2", null);

100%稼働

于 2015-09-05T06:00:00.373 に答える
-1

日付/時刻を文字列として保存する必要があることをどこで読んだかわからない!!! 同意しません。

日付/時刻をINTEGER値として保存することを好みます。読む:http ://www.sqlite.org/datatype3.html#datetime

データを挿入するときは、日付/時刻を1970-01-0100:00:00UTCからの秒数であるUnix時間に変換します。たとえば、2012年1月1日00:00:00GMTは1356998400000として表されます

Androidの日付/カレンダークラスには、UNIXTimesで日付を変換する関数とその逆の関数が組み込まれています。

チェック:http ://developer.android.com/reference/java/util/Date.html#getTime%28%29

選択するときは、BETWEENなどの通常のselectステートメントを使用できます。

私はこれを長年使用していて、それは魅力のように機能します:D

于 2013-01-08T05:25:02.827 に答える