2013-04-02 5 views
0

이것은 Android 용 프로젝트입니다. 새 테이블 열 KEY_EXAMPLE을 만들려고했습니다. 그러나 그것은 효과가 없습니다. 나는 아래 코드를 넣을 것이고 나는 이것을 고치고 싶다. 누군가 나를 도울 수 있습니까? 그것은 매우 중요합니다. 나는 초보자입니다. KEY_EXAMPLE이 작동하지 않습니다. 이것은 내 코드이며 내가이 운동을하려고하는 것입니다.새 테이블 열을 추가하는 방법은 무엇입니까?

DictionaryDatabase.Java

public class DictionaryDatabase { 
private static final String TAG = "DictionaryDatabase"; 

public static final String KEY_WORD = SearchManager.SUGGEST_COLUMN_TEXT_1; 
public static final String KEY_DEFINITION = SearchManager.SUGGEST_COLUMN_TEXT_2; 
public static final String KEY_EXAMPLE = SearchManager.SUGGEST_COLUMN_INTENT_EXTRA_DATA; 

private static final String DATABASE_NAME = "dictionary"; 
private static final String FTS_VIRTUAL_TABLE = "FTSdictionary"; 
private static final int DATABASE_VERSION = 3; 

private final DictionaryOpenHelper mDatabaseOpenHelper; 
private static final HashMap<String,String> mColumnMap = buildColumnMap(); 

public DictionaryDatabase(Context context) { 
    mDatabaseOpenHelper = new DictionaryOpenHelper(context); 
} 

private static HashMap<String,String> buildColumnMap() { 
    HashMap<String,String> map = new HashMap<String,String>(); 
    map.put(KEY_WORD, KEY_WORD); 
    map.put(KEY_DEFINITION, KEY_DEFINITION); 
    map.put(KEY_EXAMPLE, KEY_EXAMPLE); 
    map.put(BaseColumns._ID, "rowid AS " + 
      BaseColumns._ID); 
    map.put(SearchManager.SUGGEST_COLUMN_INTENT_DATA_ID, "rowid AS " + 
      SearchManager.SUGGEST_COLUMN_INTENT_DATA_ID); 
    map.put(SearchManager.SUGGEST_COLUMN_SHORTCUT_ID, "rowid AS " + 
      SearchManager.SUGGEST_COLUMN_SHORTCUT_ID); 
    return map; 
} 

public Cursor getWord(String rowId, String[] columns) { 
    String selection = "rowid = ?"; 
    String[] selectionArgs = new String[] {rowId}; 

    return query(selection, selectionArgs, columns); 

} 

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

    return query(selection, selectionArgs, columns); 

} 

private Cursor query(String selection, String[] selectionArgs, String[] columns) { 

    SQLiteQueryBuilder builder = new SQLiteQueryBuilder(); 
    builder.setTables(FTS_VIRTUAL_TABLE); 
    builder.setProjectionMap(mColumnMap); 

    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; 
} 

private static class DictionaryOpenHelper extends SQLiteOpenHelper { 

    private final Context mHelperContext; 
    private SQLiteDatabase mDatabase; 

    private static final String FTS_TABLE_CREATE = 
       "CREATE VIRTUAL TABLE " + FTS_VIRTUAL_TABLE + 
       " USING fts3 (" + 
       KEY_WORD + ", " + 
       KEY_DEFINITION + 
       KEY_EXAMPLE + ");"; 

    DictionaryOpenHelper(Context context) { 
     super(context, DATABASE_NAME, null, DATABASE_VERSION); 
     mHelperContext = context; 
    } 

    @Override 
    public void onCreate(SQLiteDatabase db) { 
     mDatabase = db; 
     mDatabase.execSQL(FTS_TABLE_CREATE); 
     loadDictionary(); 
    } 

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

    private void loadWords() throws IOException { 
     Log.d(TAG, "Loading words..."); 
     final Resources resources = mHelperContext.getResources(); 
     InputStream inputStream = resources.openRawResource(R.raw.definitions); 
     BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream)); 

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


    public long addWord(String word, String definition, String example) { 
     ContentValues initialValues = new ContentValues(); 
     initialValues.put(KEY_WORD, word); 
     initialValues.put(KEY_DEFINITION, definition); 
     initialValues.put(KEY_EXAMPLE, example); 

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

    @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); 
    } 
} 

} 

DictionaryProvider.Java

public class DictionaryProvider extends ContentProvider { 
String TAG = "DictionaryProvider"; 

public static String AUTHORITY = "com.pesquisa.dicionario.searchabledict.DictionaryProvider"; 
public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/dictionary"); 

public static final String WORDS_MIME_TYPE = ContentResolver.CURSOR_DIR_BASE_TYPE + 
               "/vnd.pesquisa.dicionario.searchabledict"; 
public static final String DEFINITION_MIME_TYPE = ContentResolver.CURSOR_ITEM_BASE_TYPE + 
                "/vnd.pesquisa.dicionario.searchabledict"; 

private DictionaryDatabase mDictionary; 

private static final int SEARCH_WORDS = 0; 
private static final int GET_WORD = 1; 
private static final int SEARCH_SUGGEST = 2; 
private static final int REFRESH_SHORTCUT = 3; 
private static final UriMatcher sURIMatcher = buildUriMatcher(); 

private static UriMatcher buildUriMatcher() { 
    UriMatcher matcher = new UriMatcher(UriMatcher.NO_MATCH); 
    matcher.addURI(AUTHORITY, "dictionary", SEARCH_WORDS); 
    matcher.addURI(AUTHORITY, "dictionary/#", GET_WORD); 
    matcher.addURI(AUTHORITY, SearchManager.SUGGEST_URI_PATH_QUERY, SEARCH_SUGGEST); 
    matcher.addURI(AUTHORITY, SearchManager.SUGGEST_URI_PATH_QUERY + "/*", SEARCH_SUGGEST); 

    matcher.addURI(AUTHORITY, SearchManager.SUGGEST_URI_PATH_SHORTCUT, REFRESH_SHORTCUT); 
    matcher.addURI(AUTHORITY, SearchManager.SUGGEST_URI_PATH_SHORTCUT + "/*", REFRESH_SHORTCUT); 
    return matcher; 
} 

@Override 
public boolean onCreate() { 
    mDictionary = new DictionaryDatabase(getContext()); 
    return true; 
} 

@Override 
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, 
        String sortOrder) { 

    switch (sURIMatcher.match(uri)) { 
     case SEARCH_SUGGEST: 
      if (selectionArgs == null) { 
       throw new IllegalArgumentException(
        "selectionArgs must be provided for the Uri: " + uri); 
      } 
      return getSuggestions(selectionArgs[0]); 
     case SEARCH_WORDS: 
      if (selectionArgs == null) { 
       throw new IllegalArgumentException(
        "selectionArgs must be provided for the Uri: " + uri); 
      } 
      return search(selectionArgs[0]); 
     case GET_WORD: 
      return getWord(uri); 
     case REFRESH_SHORTCUT: 
      return refreshShortcut(uri); 
     default: 
      throw new IllegalArgumentException("Unknown Uri: " + uri); 
    } 
} 

private Cursor getSuggestions(String query) { 
    query = query.toLowerCase(); 
    String[] columns = new String[] { 
     BaseColumns._ID, 
     DictionaryDatabase.KEY_WORD, 
     SearchManager.SUGGEST_COLUMN_INTENT_DATA_ID}; 

    return mDictionary.getWordMatches(query, columns); 
} 

private Cursor search(String query) { 
    query = query.toLowerCase(); 
    String[] columns = new String[] { 
     BaseColumns._ID, 
     DictionaryDatabase.KEY_WORD, 
     DictionaryDatabase.KEY_DEFINITION, 
     DictionaryDatabase.KEY_EXAMPLE}; 

    return mDictionary.getWordMatches(query, columns); 
} 

private Cursor getWord(Uri uri) { 
    String rowId = uri.getLastPathSegment(); 
    String[] columns = new String[] { 
     DictionaryDatabase.KEY_WORD, 
     DictionaryDatabase.KEY_DEFINITION, 
     DictionaryDatabase.KEY_EXAMPLE}; 

    return mDictionary.getWord(rowId, columns); 
} 

private Cursor refreshShortcut(Uri uri) { 

    String rowId = uri.getLastPathSegment(); 
    String[] columns = new String[] { 
     BaseColumns._ID, 
     DictionaryDatabase.KEY_WORD, 
     DictionaryDatabase.KEY_DEFINITION, 
     DictionaryDatabase.KEY_EXAMPLE, 
     SearchManager.SUGGEST_COLUMN_SHORTCUT_ID, 
     SearchManager.SUGGEST_COLUMN_INTENT_DATA_ID}; 

    return mDictionary.getWord(rowId, columns); 
} 

@Override 
public String getType(Uri uri) { 
    switch (sURIMatcher.match(uri)) { 
     case SEARCH_WORDS: 
      return WORDS_MIME_TYPE; 
     case GET_WORD: 
      return DEFINITION_MIME_TYPE; 
     case SEARCH_SUGGEST: 
      return SearchManager.SUGGEST_MIME_TYPE; 
     case REFRESH_SHORTCUT: 
      return SearchManager.SHORTCUT_MIME_TYPE; 
     default: 
      throw new IllegalArgumentException("Unknown URL " + uri); 
    } 
} 

@Override 
public Uri insert(Uri uri, ContentValues values) { 
    throw new UnsupportedOperationException(); 
} 

@Override 
public int delete(Uri uri, String selection, String[] selectionArgs) { 
    throw new UnsupportedOperationException(); 
} 

@Override 
public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) { 
    throw new UnsupportedOperationException(); 
} 

} 

SenseDictionary.Java (기본 활동)

public class SenseDictionary extends Activity { 

private TextView mTextView; 
private ListView mListView; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    requestWindowFeature(Window.FEATURE_NO_TITLE); 
    setContentView(R.layout.main); 

    mTextView = (TextView) findViewById(R.id.text); 
    mListView = (ListView) findViewById(R.id.list); 

    handleIntent(getIntent()); 
} 

@Override 
protected void onNewIntent(Intent intent) { 
    handleIntent(intent); 
} 

private void handleIntent(Intent intent) { 
    if (Intent.ACTION_VIEW.equals(intent.getAction())) { 
     Intent wordIntent = new Intent(this, WordActivity.class); 
     wordIntent.setData(intent.getData()); 
     startActivity(wordIntent); 
    } else if (Intent.ACTION_SEARCH.equals(intent.getAction())) { 
     String query = intent.getStringExtra(SearchManager.QUERY); 
     showResults(query); 
    } 
} 

private void showResults(String query) { 

    Cursor cursor = managedQuery(DictionaryProvider.CONTENT_URI, null, null, 
          new String[] {query}, null); 

    if (cursor == null) { 
     mTextView.setText(getString(R.string.no_results, new Object[] {query})); 
    } else { 
     int count = cursor.getCount(); 
     String countString = getResources().getQuantityString(R.plurals.search_results, 
           count, new Object[] {count, query}); 
     mTextView.setText(countString); 

     String[] from = new String[] { DictionaryDatabase.KEY_WORD, 
             DictionaryDatabase.KEY_DEFINITION, 
             DictionaryDatabase.KEY_EXAMPLE}; 

     int[] to = new int[] { R.id.word, 
           R.id.definition, 
           R.id.example}; 

     SimpleCursorAdapter words = new SimpleCursorAdapter(this, 
             R.layout.result, cursor, from, to); 
     mListView.setAdapter(words); 

     mListView.setOnItemClickListener(new OnItemClickListener() { 

      @Override 
      public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
       Intent wordIntent = new Intent(getApplicationContext(), WordActivity.class); 
       Uri data = Uri.withAppendedPath(DictionaryProvider.CONTENT_URI, 
               String.valueOf(id)); 
       wordIntent.setData(data); 
       startActivity(wordIntent); 
      } 
     }); 
    } 
} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    MenuInflater inflater = getMenuInflater(); 
    inflater.inflate(R.menu.main, menu); 

    if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB){ 
     SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE); 
     SearchView searchView = (SearchView) menu.findItem(R.id.search).getActionView(); 
     searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName())); 
     searchView.setIconifiedByDefault(false); 
    } 

    return true; 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    switch (item.getItemId()) { 
     case R.id.search: 
      onSearchRequested(); 
      return true; 
     default: 
      return false; 
    } 
} 
} 

WordActivity

public class WordActivity extends Activity { 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    requestWindowFeature(Window.FEATURE_NO_TITLE); 
    setContentView(R.layout.word); 

    if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB){ 
     ActionBar actionBar = getActionBar(); 
     actionBar.setDisplayHomeAsUpEnabled(true); 
    } 

    Uri uri = getIntent().getData(); 
    Cursor cursor = managedQuery(uri, null, null, null, null); 

    if (cursor == null) { 
     finish(); 
    } else { 
     cursor.moveToFirst(); 

     TextView word = (TextView) findViewById(R.id.word); 
     TextView definition = (TextView) findViewById(R.id.definition); 
     TextView example = (TextView) findViewById(R.id.example); 

     int wIndex = cursor.getColumnIndexOrThrow(DictionaryDatabase.KEY_WORD); 
     int dIndex = cursor.getColumnIndexOrThrow(DictionaryDatabase.KEY_DEFINITION); 
     int eIndex = cursor.getColumnIndexOrThrow(DictionaryDatabase.KEY_EXAMPLE); 

     word.setText(cursor.getString(wIndex)); 
     definition.setText(cursor.getString(dIndex)); 
     example.setText(cursor.getString(eIndex)); 
    } 
} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    MenuInflater inflater = getMenuInflater(); 
    inflater.inflate(R.menu.main, menu); 

    if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB){ 
     SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE); 
     SearchView searchView = (SearchView) menu.findItem(R.id.search).getActionView(); 
     searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName())); 
     searchView.setIconifiedByDefault(false); 
    } 

    return true; 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    switch (item.getItemId()) { 
     case R.id.search: 
      onSearchRequested(); 
      return true; 
     case android.R.id.home: 
      Intent intent = new Intent(this, SenseDictionary.class); 
      intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
      startActivity(intent); 
      return true; 
     default: 
      return false; 
    } 
} 
} 
+0

아무도 나를 도울 수 있습니까 ??? –

답변

1

도움을 드리고 싶지만 몇 가지 문제가 있습니다.

첫 번째 질문 : 한 시간 전에 질문을 게시했습니다. 일반적으로 stackoverflow 커뮤니티는 다음 질문이 오기를 간절히 기다리지 않습니다. 인내심을 가져야합니다.

두 번째 : 프로그램을 게시했을뿐입니다. 문제를 파악하기 위해 단계별로 단계별로 나설 의사가있는 사람이있을 수 있습니다. 나는 그 사람이나 운이 좋겠지 만, 그 일을하기를 주저합니다. stackoverflow 내 전임 일이 아니므로, 15-20 분 그냥 (무엇이든) 귀하의 프로그램이 무엇인지 알아낼 지출 할 수 없습니다. 간단한 프로그램이 아닙니다. 데이터베이스, 컨텐츠 제공자 및 두 가지 활동이 있습니다.

세 번째 : 프로그램에 하나의 의견이 없습니다. 디버그하기가 더 어려워집니다.

넷째 : "새 테이블 열을 만들려고했습니다 : KEY_EXAMPLE.하지만 작동하지 않습니다." 무슨 일이야? 왜 그것이 효과가 없다고 생각합니까? 무엇을 기대합니까?

당신이 곤란한 특정 질문이나 문제가있을 때 stackoverflow가 작동합니다. 본질적으로 "나를 위해 내 프로그램을 고쳐라"고 묻는 것은 최악의 경우입니다.

이 모든 것을 언급 했으므로 나는 벽에없는 추측을 시도 할 것입니다. 이전에이 응용 프로그램을 실행하고 이전 버전의 데이터베이스를 만들었습니까? 그렇다면 이전 버전을 삭제할 장소가 표시되지 않습니다. 이전 버전을 삭제하기 전까지는 새 열을 포함하여 새 버전을 만들 수 없습니다. 설정> 앱>앱 이름> 데이터 지우기를 사용하거나 프로그램 자체에 넣을 수 있습니다.

행운을 빈다.

관련 문제