2016-12-02 4 views
0

私は4列のデータベースを持っていますint id |文字列データ| | int bootと私はそれにいくつかのデータがあります。 idやdataの文字列で呼び出すときにgetRow(String s)メソッドがあり、そのオプションにクエリを変更すると動作しますが、同じ日付の行を取得しようとしたときにcursor.moveToFirst条件を渡すことはありません。私は、データベースに2つの行を持ってクエリがデータを返さないSQLite

String CREATE_TABLE = "CREATE TABLE " 
      + TABLE_NAME + "(" + COLUMN_ID + " INTEGER PRIMARY KEY AUTOINCREMENT," + COLUMN_DATA 
      + " TEXT," + COLUMN_DATE + " TEXT," + COLUMN_BOOT + " Integer" + ")"; 


public String getRowID(String id){ 
    SQLiteDatabase db = this.getReadableDatabase(); 
    Cursor c = db.rawQuery("select * from " + TABLE_NAME + " where " + COLUMN_ID + " = " + id, null); 
    if (c != null && c.moveToFirst()) { 
     //loggin succes 
     return "string"; 
    }else return null; 
} 

public String getRowDate(String date){ 
    SQLiteDatabase db = this.getReadableDatabase(); 
    Cursor c = db.rawQuery("select * from " + TABLE_NAME + " where " + COLUMN_DATE + " = " + date, null); 
    if (c != null && c.moveToFirst()) { 
     //loggin succes 
     return "string"; 
    }else return null; 
} 

myDb.getRowID("1"); returning something 
myDb.getRowDate("02122016"); returning null 

は、ここに私のコードです。

1 | 0.19 | 01122016 | 0 
2 | 0.19 | 02122016 | 0 

答えて

2

整数と文字列を比較するときは注意してください。あなたの引数が文字列であるため、SQLiteのは、すべての整数を比較することになるなぜあなたはあなたの生のクエリは、このようになっていることを考えるまでは、疑問に思うことがあります。

select * from TABLE where DATE = 02122016 

値は整数として解釈され、テキストに変換し、それが失われていることプロセスの先頭ゼロ。あなたはsqlite3のシェルでこれを確認することができます

sqlite> select 02122016; 
2122016 
sqlite> select '02122016' = 02122016; 
0 -- false 
sqlite> select cast(02122016 as text); 
2122016 

最も簡単な修正がDatabaseUtilsからメソッドを使用して値を引用することです:

String escaped = DatabaseUtils.sqlEscapeString(date); 
String query = "select * from " + TABLE_NAME + " where " + COLUMN_DATE + " = " + escaped; 

より良い修正が代わりにプレースホルダ引数を使用することです。 Androidは文字列としてすべての引数を結合することに注意してください:

String query = "select * from " + TABLE_NAME + " where " + COLUMN_DATE + " = ?"; 
db.rawQuery(query, new String[]{date}); 

しかし、私のアドバイスはrawQuery()を使用し、代わりに実際のquery()のいずれかの方法を使用しないことであろう。 Here's a good example

最後に、日付を格納するための別の形式を検討する必要があります。実際には、私は通常、Unixのタイムスタンプ(エポックからの秒数またはミリ秒単位)を持つINTEGER列を格納するか、yyyy-MM-dd形式の値を持つTEXT列を使用します。これはSQLiteの多数のdatetime関数によって暗黙的にサポートされています。

+0

多くの例と私の問題を解決する方法で素晴らしい答え。ありがとう – Blackess

-2

ここではデータを取得するために使用したコードの一部を示します。これはdeveloper.android.comの公式Googleチュートリアルからのものです。 SQLiteデータベースなどのデータを使って検索することができます。

import android.provider.BaseColumns; 

/** 
* Created by User on 11/3/2016. 
*/ 

public final class FeedReaderContract { 
    private FeedReaderContract(){} 

    // Inner class that defines table content 
    public static class FeedEntry implements BaseColumns{ 
     public static final String TABLE_NAME = "clickdata"; 
     public static final String COLUMN_NAME_CLICKS = "clicks"; 
     public static final String COLUMN_NAME_TIME = "time"; 
    } 
} 

import android.content.Context; 
import android.database.sqlite.SQLiteDatabase; 
import android.database.sqlite.SQLiteOpenHelper; 

/** 
* Created by User on 11/3/2016. 
*/ 

public class FeedReaderDbHelper extends SQLiteOpenHelper { 
    private static final String INTEGER_TYPE = " INTEGER"; 
    private static final String STRING_TYPE = " STRING"; 
    private static final String COMMA_SEP = ","; 
    private static final String SQL_CREATE_ENTRIES = 
      "CREATE TABLE " + FeedReaderContract.FeedEntry.TABLE_NAME + " (" + 
        FeedReaderContract.FeedEntry._ID + " INTEGER PRIMARY KEY," + 
        FeedReaderContract.FeedEntry.COLUMN_NAME_CLICKS + INTEGER_TYPE + COMMA_SEP + 
        FeedReaderContract.FeedEntry.COLUMN_NAME_TIME + STRING_TYPE +")"; 

    private static final String SQL_DELETE_ENTRIES = 
      "DROP TABLE IF EXISTS " + FeedReaderContract.FeedEntry.TABLE_NAME; 
    // If you change the database schema, you must increment the database version. 
    public static final int DATABASE_VERSION = 1; 
    public static final String DATABASE_NAME = "ClickData.db"; 

    public FeedReaderDbHelper(Context context) { 
     super(context, DATABASE_NAME, null, DATABASE_VERSION); 
    } 
    public void onCreate(SQLiteDatabase db) { 
     db.execSQL(SQL_CREATE_ENTRIES); 
    } 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
     // This database is only a cache for online data, so its upgrade policy is 
     // to simply to discard the data and start over 
     db.execSQL(SQL_DELETE_ENTRIES); 
     onCreate(db); 
    } 
    public void onDowngrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
     onUpgrade(db, oldVersion, newVersion); 
    } 
} 

MainActivity:

private void saveData(int clicks, String time){ 
     FeedReaderDbHelper mDbHelper = new FeedReaderDbHelper(this); 
     SQLiteDatabase db = mDbHelper.getWritableDatabase(); 
     ContentValues values = new ContentValues(); 
     values.put(FeedReaderContract.FeedEntry.COLUMN_NAME_CLICKS, clicks); 
     values.put(FeedReaderContract.FeedEntry.COLUMN_NAME_TIME, time); 
     long newRowId = db.insert(FeedReaderContract.FeedEntry.TABLE_NAME, null, values); 
    } 
    private void readFromFile(){ 
     FeedReaderDbHelper mDbHelper = new FeedReaderDbHelper(this); 
     SQLiteDatabase db = mDbHelper.getWritableDatabase(); 
     String[] projection = { 
       FeedReaderContract.FeedEntry.COLUMN_NAME_CLICKS, 
       FeedReaderContract.FeedEntry.COLUMN_NAME_TIME, 
     }; 
// Filter results WHERE "title" = 'My Title' 
     Cursor c = db.query(
       FeedReaderContract.FeedEntry.TABLE_NAME,      // The table to query 
       projection,        // The columns to return 
       null,        // The columns for the WHERE clause 
       null,       // The values for the WHERE clause 
       null,          // don't group the rows 
       null,          // don't filter by row groups 
       null         // The sort order 
     ); 
     c.moveToFirst(); 
     clickCount = new int[c.getCount()]; 
     int i = 0; 
     while(c.moveToNext()){ 
      int uname = c.getInt(c.getColumnIndexOrThrow(FeedReaderContract.FeedEntry.COLUMN_NAME_CLICKS)); 
      clickCount[i] = uname; 
      i++; 
     } 
     dateCount = new String[c.getCount()]; 
     int i2 = 0; 
     while(c.moveToNext()){ 
      String uname = c.getString(c.getColumnIndexOrThrow(FeedReaderContract.FeedEntry.COLUMN_NAME_TIME)); 
      dateCount[i2] = uname; 
      i2++; 
     } 
    } 

うまくいけば、このコードを助け、あなたが何をする必要があるかにそれを適応させることができます。クラスは別々のファイルにあり、メソッドはMainActivity.javaにあります。データベースを初めて作成したときは苦労しましたが、すべてのコードをスクラップしなければならない場合があります。時々それをすることを恐れてはいけません。

+0

これは質問に答える適切な方法ではありません。 – Karakuri

関連する問題