2016-11-10 25 views
0

現在、私のアプリケーションで行われた最近の検索のリストを保存するSQLiteデータベースがあります。私は現在、次のように挿入しています:SQLiteデータベースの行数を制限する

/** 
    * Inserts a RecentSearch into the Recent Searches Table 
    * 
    * @param aRecentSearch - The RecentSearch 
    */ 
    public void insertSearchIntoDB(RecentSearch aRecentSearch) { 
    SQLiteDatabase db = helper.getWritableDatabase(); 
    try { 
     ContentValues contentValues = new ContentValues(); 
     contentValues.put(DBHelper.ENTITY_ID, aRecentSearch.getEntityId()); 
     contentValues.put(DBHelper.SEARCH_PHRASE, aRecentSearch.getPhrase()); 
     contentValues.put(DBHelper.SEARCH_TYPE, aRecentSearch.getSearchType().getItemId()); 
     contentValues.put(DBHelper.SEARCH_CATEGORY_NAME, aRecentSearch.getCategoryName()); 
     contentValues.put(DBHelper.SEARCH_TIME, aRecentSearch.getSearchTime()); 
     contentValues.put(DBHelper.RATINGS, aRecentSearch.getSellerRatingsCount()); 
     contentValues.put(DBHelper.STAR_COUNT, aRecentSearch.getSellerStarCount()); 
     contentValues.put(DBHelper.SELLER_VERIFIED, TradeUtils.getBooleanAsInt(aRecentSearch.isSellerVerified())); 

     db.insertWithOnConflict(DBHelper.RECENT_SEARCHES_TABLE, null, contentValues, SQLiteDatabase.CONFLICT_REPLACE); 

    } catch (Exception e) { 
     Log.e("TAG", "insertSearchIntoDB: " + aRecentSearch.getPhrase()); 
    } finally { 
     if (db.isOpen()) { 
     db.close(); 
     } 
    } 
    } 

と、このようなデータベースから最新の8件の最近の検索取得:

public List<RecentSearch> getRecentSearchesFromDataBase() { 
    SQLiteDatabase db = helper.getWritableDatabase(); 
    Cursor cursor = db.query(DBHelper.RECENT_SEARCHES_TABLE, DBHelper.RECENT_SEARCHES_COLUMNS_AS_ARRAY, null, null, null, null, DBHelper.SEARCH_TIME + " DESC LIMIT 8"); 
    List<RecentSearch> recentSearchesList = new ArrayList<>(); 
    try { 
     if (cursor.getCount() > 0) { 
     while (cursor.moveToNext()) { 
      RecentSearch recentSearch = new RecentSearch(); 

      int id_Index = cursor.getColumnIndex(DBHelper.ID); 
      int entityId_Index = cursor.getColumnIndex(DBHelper.ENTITY_ID); 
      int searchCategory_Index = cursor.getColumnIndex(DBHelper.SEARCH_CATEGORY_NAME); 
      int searchPhrase_Index = cursor.getColumnIndex(DBHelper.SEARCH_PHRASE); 
      int searchType_Index = cursor.getColumnIndex(DBHelper.SEARCH_TYPE); 
      int searchTime_Index = cursor.getColumnIndex(DBHelper.SEARCH_TIME); 
      int sellerRatings_Index = cursor.getColumnIndex(DBHelper.RATINGS); 
      int sellerVerified_Index = cursor.getColumnIndex(DBHelper.SELLER_VERIFIED); 
      int sellerStarCount_Index = cursor.getColumnIndex(DBHelper.STAR_COUNT); 

      recentSearch.setId(cursor.getInt(id_Index)); 
      recentSearch.setEntityId(cursor.getInt(entityId_Index)); 
      recentSearch.setPhrase(cursor.getString(searchPhrase_Index)); 
      recentSearch.setCategoryName(cursor.getString(searchCategory_Index)); 
      recentSearch.setSearchType(SearchType.getValueOrDefault(cursor.getInt(searchType_Index), SearchType.TRADE_SEARCH)); 
      recentSearch.setSearchTime(cursor.getLong(searchTime_Index)); 
      recentSearch.setSellerVerified(TradeUtils.getBooleanFromInt(cursor.getInt(sellerVerified_Index))); 
      recentSearch.setSellerRatingsCount(cursor.getInt(sellerRatings_Index)); 
      recentSearch.setSellerStarCount(cursor.getInt(sellerStarCount_Index)); 

      recentSearchesList.add(recentSearch); 
     } 
     } 
    } catch (Exception e) { 
     Log.e("TAG", "getRecentSearchesFromDataBase"); 
    } finally { 
     cursor.close(); 
    } 
    return recentSearchesList; 
    } 

を今私の心配は、データベースがまだすべての最近検索し、すべてのIを節約するということです

カーソルcursor = db.query(DBHelper.RECENT_SEARCHES_TABLE、DBHelper.RECENT_SEARCHES_COLUMNS_AS_ARRAY、NULL、NULL、NULL、NULL、DBHelper.SEARC:ちょうどlatestsのこの行で8件の最近の検索を引っ張ってやっていますH_TIME + "DESC LIMIT 8");

だから私のテーブルには、例えば30件の最近の検索を持つことになりますが、私は唯一の私が知りたいのですが、最新の8

は、私はどちらかのテーブルにある8つの以上のエントリを防止または削除することができますどのように引っ張っていますテーブルの最新の8つのエントリを除くすべてのエントリ?

+0

擬似コードが必要ですか? –

答えて

0

1つの可能な方法をチェックして、そのテーブルから不要な行を削除するために、特定のテーブルにデータを入力しながら、ここにトリガーを使用することです、ありがとうございました。

トリガーは、指定されたテーブルに対して指定された変更操作(INSERT、UPDATEおよびDELETEステートメント)が実行されたときに自動的に実行されるイベントドリブンアクションです。あなたはより詳細にトリガーhereを通過することができます。

+0

私はこれを見つけました(http://stackoverflow.com/a/18677756/4578531)トリガーが使用されているところで、私はこのトリガーを使用するところで少し混乱していますか? – x10sion

+0

コードからトリガーを自分で呼び出す必要はありません。 DBにテーブルを作成するのと同じトリガーを作成するだけです。 DBはあなたがそのトリガを作成した各イベントでそれを呼び出す世話をします。 –

+0

トリガーを書きたくない場合。不要な行を削除するには、挿入クエリのたびにdeleteクエリを実行する必要があります。 –

関連する問題