package com.oreilly.demo.android.pa.searchdemo; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.ArrayList; import android.app.SearchManager; import android.content.ContentValues; import android.content.Context; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; import android.database.sqlite.SQLiteQueryBuilder; import android.provider.BaseColumns; public class SearchDBLogic implements SearchLogicInterface { public static final String SONNETTABLE = "SONNETS"; public static final String SONNETNUM = SearchManager.SUGGEST_COLUMN_TEXT_1; public static final String SONNETSTR = "SONNETSTR"; public static final String LINENUM = "LINENUM"; public static final String LINETXT = SearchManager.SUGGEST_COLUMN_TEXT_2; private static final String[] COLS = {BaseColumns._ID, SONNETNUM, SONNETSTR, LINENUM, LINETXT}; private SonnetsSQLOpenHelper sql; public SearchDBLogic(Context context, int resourceId) throws Exception { sql = new SonnetsSQLOpenHelper(context); sql.getWritableDatabase(); readInSonnets(context, resourceId); } public SonnetFragment[] search(String query) { SonnetFragment[] frags = new SonnetFragment[0]; Cursor cur = searchDB(query); if(cur != null) { ArrayList<SonnetFragment> arr = new ArrayList<SonnetFragment>(); while(cur.moveToNext()) { arr.add( new SonnetFragment(cur.getInt(cur.getColumnIndex(SONNETNUM)), cur.getString(cur.getColumnIndex(LINETXT)))); } if(!arr.isEmpty()) { frags = arr.toArray(new SonnetFragment[arr.size()]); } } return frags; } public Sonnet getSonnet(int i) { Sonnet sonnet = null; Cursor cur = getSonnetCursor(i); if(cur != null) { String num = null; ArrayList<String> arr = new ArrayList<String>(); while(cur.moveToNext()) { if(num == null) num = cur.getString(cur.getColumnIndex(SONNETSTR)); arr.add(cur.getString(cur.getColumnIndex(LINETXT))); } if(!arr.isEmpty()) { sonnet = new Sonnet(num, arr.toArray(new String[arr.size()])); } } return sonnet; } public Cursor getSonnetCursor(int i) { String selection = SONNETNUM + " = ?"; String[] selectionArgs = new String[] {i+""}; Cursor cur = query(selection, selectionArgs, COLS, LINENUM); return cur; } public Cursor searchDB(String query) { return searchDB(query, COLS); } public Cursor searchDB(String query, String[] columns) { query = query.toLowerCase(); String selection = LINETXT + " LIKE ?"; String[] selectionArgs = new String[] {"%"+query+"%"}; return query(selection, selectionArgs, columns, null); } private Cursor query(String selection, String[] selectionArgs, String[] columns, String sort) { SQLiteQueryBuilder builder = new SQLiteQueryBuilder(); builder.setTables(SONNETTABLE); Cursor cursor = builder.query(sql.getReadableDatabase(), columns, selection, selectionArgs, null, null, sort); if (cursor == null) { return null; } else if (!cursor.moveToFirst()) { cursor.close(); return null; } return cursor; } private void readInSonnets(Context context, int resourceId) throws Exception { BufferedReader br = null; try { br = new BufferedReader( new InputStreamReader(context.getResources().openRawResource(resourceId))); String line = null; String num = null; ArrayList<String> ls = new ArrayList<String>(); int id = 0; while ((line = br.readLine()) != null) { if(line.length() < 15 && line.endsWith(".".intern())) { String curnum = line.substring(0, line.length() - 1); if(num != null) { int size = ls.size(); Sonnet sonnet = new Sonnet(num, ls.toArray(new String[size])); if(sql != null) { for(int i=0;i<size;i++) { sql.addSonnet( id++, sonnet.num, sonnet.title, i, sonnet.lines[i]); } } } num = curnum; ls.clear(); } else if(line.trim().length() > 1) { ls.add(line); } } } finally { try { if(br != null) { br.close(); } } catch (IOException e) { e.printStackTrace(); } } } private static class SonnetsSQLOpenHelper extends SQLiteOpenHelper { private SQLiteDatabase sonnetdb; public SonnetsSQLOpenHelper(Context context) { super(context, null, null, 1); // in-memory db } @Override public void onCreate(SQLiteDatabase db) { sonnetdb = db; sonnetdb.execSQL("CREATE TABLE "+ SONNETTABLE+ " ("+BaseColumns._ID +" INTEGER, "+ SONNETNUM+" INTEGER, "+ SearchManager.SUGGEST_COLUMN_INTENT_DATA_ID+ " TEXT, "+SONNETSTR+" TEXT, "+ LINENUM+" INTEGER, "+LINETXT+ " TEXT);"); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { // ignore upgrade case since we are doing in memory } public long addSonnet(int id, int sonnetnum, String sonnetstr, int linenum, String line) { ContentValues initialValues = new ContentValues(); initialValues.put(BaseColumns._ID, id); initialValues.put(SONNETNUM, sonnetnum); initialValues.put(SearchManager.SUGGEST_COLUMN_INTENT_DATA_ID, ""+sonnetnum); initialValues.put(LINENUM, linenum); initialValues.put(SONNETSTR, sonnetstr); initialValues.put(LINETXT, line); return sonnetdb.insert(SONNETTABLE, null, initialValues); } } }