2016-06-29 19 views
0

私のSQLiteデータベースを検索してカーソルを返す方法がnullを返す理由がわかりません。私はtxtファイルからデータベースを読み込み、アプリケーションで検索機能を実装しようとしている間、私は可能性のある一致のリストを返すために同じデータベースを照会しようとしています。しかし、私はバック・エラーを追跡するので、このメソッドは、私が必要とするカーソルの代わりにnullを返すことに気づきました。誰もこれで私を助けることができますか?喜んで私はこれに非常に新しいです、そして助けを感謝するでしょう。どうもありがとう、再びSQLiteデータベースのクエリがnullを返すのはなぜですか?

public class DatabaseTable { 

    public static final String TAG = "ConstantDatabase"; 

    //the columns included in the table 
    public static final String COL_QUANTITY = "QUANTIY"; 
    public static final String COL_VALUE = "VALUE"; 
    public static final String COL_UNCERTAINTY = "UNCERTAINTY"; 
    public static final String COL_UNIT = "UNIT"; 
    public static final String _id = "_id"; 

    private static final String DATABASE_NAME = "CONSTANTS"; 
    private static final String FTS_VIRTUAL_TABLE = "FTS"; 
    private static final int DATABASE_VERSION = 1; 

    private final DatabaseOpenHelper mDatabaseOpenHelper; 

    public DatabaseTable(Context context){ 
     mDatabaseOpenHelper = new DatabaseOpenHelper(context); 
    } 

    private static class DatabaseOpenHelper extends SQLiteOpenHelper { 

     private final Context mHelperContext; 
     private SQLiteDatabase mDatabase; 

     private static final String FTS_TABLE_CREATE = 
       "CREATE VIRTUAL TABLE " + FTS_VIRTUAL_TABLE + 
         " USING fts3 (" +_id+ ", "+ 
         COL_QUANTITY + ", " + 
         COL_VALUE + "," + 
         COL_UNCERTAINTY + "," + 
         COL_UNIT + ")"; 

     public DatabaseOpenHelper(Context context) { 
      super(context, DATABASE_NAME, null, DATABASE_VERSION); 
      Log.e("Database Operation", "DatabaseOpenHelper constructor called"); 
      mHelperContext = context; 
     } 

     @Override 
     public void onCreate(SQLiteDatabase db) { 
      mDatabase = db; 
      mDatabase.execSQL(FTS_TABLE_CREATE); 
      Log.e("Database Operation", "Constants Table Created ..."); 
      loadConstants(); 
     } 

     @Override 
     public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
      Log.w(TAG, "Upgrading database from version " + oldVersion + " to " 
        + newVersion + ", which will destroy all old data"); 
      db.execSQL("DROP TABLE IF EXISTS " + FTS_VIRTUAL_TABLE); 
      onCreate(db); 
     } 

     public SQLiteDatabase getmDatabase(){ 
      return mDatabase; 
     } 


//  populating the virtual table with a string reading code 

     private void loadConstants() { 
      new Thread(new Runnable() { 
       public void run() { 
        try { 
         loadConstantss(); 
        } catch (IOException e) { 
         throw new RuntimeException(e); 
        } 
       } 
      }).start(); 

      Log.e("Loading", "Constants Table Populated ..."); 
     } 

     private void loadConstantss() throws IOException { 
      final Resources resources = mHelperContext.getResources(); 
      InputStream inputStream = resources.openRawResource(R.raw.txt); 
      BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream)); 

      try { 
       String line; 
       while ((line = reader.readLine()) != null) { 
        String[] strings = TextUtils.split(line, ","); 
        if (strings.length < 4) continue; 
        long id = addConstant(strings[0].trim(), strings[1].trim(), strings[2].trim(), strings[3].trim()); 
        if (id < 0) { 
         Log.e(TAG, "unable to add word: " + strings[0].trim()); 
        } 
       } 
      } finally { 
       reader.close(); 
      } 
     } 

     public long addConstant(String quantity, String value, String uncertainty, String unit) { 
      ContentValues initialValues = new ContentValues(); 
      initialValues.put(COL_QUANTITY, quantity); 
      initialValues.put(COL_VALUE, value); 
      initialValues.put(COL_UNCERTAINTY, uncertainty); 
      initialValues.put(COL_UNIT, unit); 

      return mDatabase.insert(FTS_VIRTUAL_TABLE, null, initialValues); 
     } 

     //database openhelper ends 
    } 

    public Cursor getWordMatches(String query, String[] columns) { 
     String selection = COL_QUANTITY + " MATCH ?"; 
     String[] selectionArgs = new String[] {query+"*"}; 

     return query(selection, selectionArgs, columns); 
    } 

    public Cursor query(String selection, String[] selectionArgs, String[] columns) { 
     SQLiteQueryBuilder builder = new SQLiteQueryBuilder(); 
     builder.setTables(FTS_VIRTUAL_TABLE); 

     Cursor cursor = builder.query(mDatabaseOpenHelper.getReadableDatabase(), 
       columns, selection, selectionArgs, null, null, null); 

     if (cursor == null) { 
      return null; 
     } else if (!cursor.moveToFirst()) { 
      cursor.close(); 
      return null; 
     } 
     return cursor; 
    } 

    public Cursor getAllTitles() 
    { 
     return mDatabaseOpenHelper.getmDatabase().query(FTS_VIRTUAL_TABLE, new String[] { 
         COL_QUANTITY, 
         COL_UNCERTAINTY, 
         COL_UNIT, 
         COL_VALUE}, 
       null, 
       null, 
       null, 
       null, 
       null); 
    } 
} 

は、ここではnullを返す方法getWordMatches()で、私のデータベーステーブルです。

EDIT:

Cursor c=db.getWordMatches(query,colums); 
Log.e("cursor returned",c.toString()); 

ログ猫はあなたのコードが閉じ

java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String java.lang.Object.toString()' on a null object reference 
+0

あなたはエラーを投稿しますか? –

+0

もちろん、私の悪い – grassss

答えて

2

返さ:これに私を導いた元のエラーが、これは別のアクティビティに呼び出されたときにということでした

カーソルがデータがない場合

if (cursor == null) { 
    return null; 
} else if (!cursor.moveToFirst()) { 
    cursor.close(); 
    return null; 
} 

このようにすると、共通のユースケースでnull値が返されます。その後、あなたは、これはあなたがカーソルがあなただけそうしないと、あなたの実装を改善する必要があるかもしれません

Log.e("cursor returned", String.valueOf(c)); 

でそれを置き換えることができますオフに使用する唯一の場所である場合

Log.e("cursor returned", c.toString()); 

をチェックせずに、カーソルを使用しています。とにかく、DatabaseUtilsを調べることをお勧めします。

関連する問題