2013-04-04 69 views
2

大家好。我使用SQL數據庫爲我創建了一本個人詞典。所以,現在我想添加一個「自動完成textview」作爲一個搜索字段,從我的應用程序(搜索插入到數據庫中的特定數據)更新主活動中的「listview」。正如你看到的,主要活動顯示了表中的WORDS列表(第一列)....我不知道如何使用SQL數據庫創建像textwatcher之類的搜索框或類似的東西。有人能幫助我嗎?我是新手!帶有SQL數據庫的自動完成TextView

的源代碼:

RepositorioPalavra.JAVA

public class RepositorioPalavra { 
private static final String CATEGORIA = "dados"; 

// Nome do banco 
private static final String NOME_BANCO = "dados_android"; 
// Nome da tabela 
public static final String NOME_TABELA = "palavra"; 

protected SQLiteDatabase db; 

public RepositorioPalavra(Context ctx) { 
    // Abre o banco de dados já existente 
    db = ctx.openOrCreateDatabase(NOME_BANCO, Context.MODE_PRIVATE, null); 
} 

protected RepositorioPalavra() { 
    // Apenas para criar uma subclasse... 
} 

// Salva o carro, insere um novo ou atualiza 
public long salvar(Palavra palavra) { 
    long id = palavra.id; 

    if (id != 0) { 
     atualizar(palavra); 
    } else { 
     // Insere novo 
     id = inserir(palavra); 
    } 

    return id; 
} 

// Insere um novo carro 
public long inserir(Palavra palavra) { 
    ContentValues values = new ContentValues(); 
    values.put(Palavras.WORD, palavra.word); 
    values.put(Palavras.DEFINITION, palavra.definition); 
    values.put(Palavras.EXAMPLE, palavra.example); 

    long id = inserir(values); 
    return id; 
} 

// Insere um novo carro 
public long inserir(ContentValues valores) { 
    long id = db.insert(NOME_TABELA, "", valores); 
    return id; 
} 

// Atualiza o carro no banco. O id do carro é utilizado. 
public int atualizar(Palavra palavra) { 
    ContentValues values = new ContentValues(); 
    values.put(Palavras.WORD, palavra.word); 
    values.put(Palavras.DEFINITION, palavra.definition); 
    values.put(Palavras.EXAMPLE, palavra.example); 

    String _id = String.valueOf(palavra.id); 

    String where = Palavras._ID + "=?"; 
    String[] whereArgs = new String[] { _id }; 

    int count = atualizar(values, where, whereArgs); 

    return count; 
} 

// Atualiza o carro com os valores abaixo 
// A cláusula where é utilizada para identificar o carro a ser atualizado 
public int atualizar(ContentValues valores, String where, String[] whereArgs) { 
    int count = db.update(NOME_TABELA, valores, where, whereArgs); 
    Log.i(CATEGORIA, "Atualizou [" + count + "] registros"); 
    return count; 
} 

// Deleta o carro com o id fornecido 
public int deletar(long id) { 
    String where = Palavras._ID + "=?"; 

    String _id = String.valueOf(id); 
    String[] whereArgs = new String[] { _id }; 

    int count = deletar(where, whereArgs); 

    return count; 
} 

// Deleta o carro com os argumentos fornecidos 
public int deletar(String where, String[] whereArgs) { 
    int count = db.delete(NOME_TABELA, where, whereArgs); 
    Log.i(CATEGORIA, "Deletou [" + count + "] registros"); 
    return count; 
} 

// Busca o carro pelo id 
public Palavra buscarPalavra(long id) { 
    // select * from carro where _id=? 
    Cursor c = db.query(true, NOME_TABELA, Palavra.colunas, Palavras._ID + "=" + id, null, null, null, null, null); 

    if (c.getCount() > 0) { 

     // Posicinoa no primeiro elemento do cursor 
     c.moveToFirst(); 

     Palavra palavra = new Palavra(); 

     // Lê os dados 
     palavra.id = c.getLong(0); 
     palavra.word = c.getString(1); 
     palavra.definition = c.getString(2); 
     palavra.example = c.getString(3); 

     return palavra; 
    } 

    return null; 
} 

// Retorna um cursor com todos os carros 
public Cursor getCursor() { 
    try { 
     // select * from carros 
     return db.query(NOME_TABELA, Palavra.colunas, null, null, null, null, Palavras.WORD); 
    } catch (SQLException e) { 
     Log.e(CATEGORIA, "Erro ao buscar as expressões: " + e.toString()); 
     return null; 
    } 
} 

// Retorna uma lista com todos os carros 
public List<Palavra> listarPalavras() { 
    Cursor c = getCursor(); 

    List<Palavra> palavras = new ArrayList<Palavra>(); 

    if (c.moveToFirst()) { 

     // Recupera os índices das colunas 
     int idxId = c.getColumnIndex(Palavras._ID); 
     int idxNome = c.getColumnIndex(Palavras.WORD); 
     int idxPlaca = c.getColumnIndex(Palavras.DEFINITION); 
     int idxAno = c.getColumnIndex(Palavras.EXAMPLE); 

     // Loop até o final 
     do { 
      Palavra palavra = new Palavra(); 
      palavras.add(palavra); 

      // recupera os atributos de carro 
      palavra.id = c.getLong(idxId); 
      palavra.word = c.getString(idxNome); 
      palavra.definition = c.getString(idxPlaca); 
      palavra.example = c.getString(idxAno); 

     } while (c.moveToNext()); 
    } 

    return palavras; 
} 

// Busca o carro pelo nome "select * from carro where nome=?" 
public Palavra buscarPalavraPorNome(String word) { 
    Palavra palavra = null; 

    try { 
     // Idem a: SELECT _id,nome,placa,ano from CARRO where nome = ? 
     Cursor c = db.query(NOME_TABELA, Palavra.colunas, Palavras.WORD + "='" + word + "'", null, null, null, null); 

     // Se encontrou... 
     if (c.moveToNext()) { 

      palavra = new Palavra(); 

      // utiliza os métodos getLong(), getString(), getInt(), etc para recuperar os valores 
      palavra.id = c.getLong(0); 
      palavra.word = c.getString(1); 
      palavra.definition = c.getString(2); 
      palavra.example = c.getString(3); 
     } 
    } catch (SQLException e) { 
     Log.e(CATEGORIA, "Erro ao buscar a expressão pelo nome: " + e.toString()); 
     return null; 
    } 

    return palavra; 
} 

// Busca um carro utilizando as configurações definidas no 
// SQLiteQueryBuilder 
// Utilizado pelo Content Provider de carro 
public Cursor query(SQLiteQueryBuilder queryBuilder, String[] projection, String selection, String[] selectionArgs, 
     String groupBy, String having, String orderBy) { 
    Cursor c = queryBuilder.query(this.db, projection, selection, selectionArgs, groupBy, having, orderBy); 
    return c; 
} 

// Fecha o banco 
public void fechar() { 
    // fecha o banco de dados 
    if (db != null) { 
     db.close(); 
    } 
} 
} 

Palavra.Java

public class Palavra { 

public static String[] colunas = new String[] { Palavras._ID, Palavras.WORD, Palavras.DEFINITION, Palavras.EXAMPLE }; 

/** 
* Pacote do Content Provider. Precisa ser único. 
*/ 
public static final String AUTHORITY = "br.dicionario.provider.palavra"; 

public long id; 
public String word; 
public String definition; 
public String example; 

public Palavra() { 
} 

public Palavra(String word, String definition, String example) { 
    super(); 
    this.word = word; 
    this.definition = definition; 
    this.example = example; 
} 

public Palavra(long id, String word, String definition, String example) { 
    super(); 
    this.id = id; 
    this.word = word; 
    this.definition = definition; 
    this.example = example; 
} 

/** 
* Classe interna para representar as colunas e ser utilizada por um Content 
* Provider 
* 
* Filha de BaseColumns que já define (_id e _count), para seguir o padrão 
* Android 
*/ 
public static final class Palavras implements BaseColumns { 

    // Não pode instanciar esta Classe 
    private Palavras() { 
    } 

    // content://br.livro.android.provider.carro/carros 
    public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/palavras"); 

    // Mime Type para todos os carros 
    public static final String CONTENT_TYPE = "vnd.android.cursor.dir/vnd.google.palavras"; 

    // Mime Type para um único carro 
    public static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/vnd.google.palavras"; 

    // Ordenação default para inserir no order by 
    public static final String DEFAULT_SORT_ORDER = "_id ASC"; 

    public static final String WORD = "word"; 
    public static final String DEFINITION = "definition"; 
    public static final String EXAMPLE = "example"; 

    // Método que constrói uma Uri para um Carro específico, com o seu id 
    // A Uri é no formato "content://br.livro.android.provider.carro/carros/id" 
    public static Uri getUriId(long id) { 
     // Adiciona o id na URI default do /carros 
     Uri uriPalavra = ContentUris.withAppendedId(Palavras.CONTENT_URI, id); 
     return uriPalavra; 
    } 
} 

@Override 
public String toString() { 
    return "Word: " + word + ", Definition: " + definition + ", Example: " + example; 
} 

}

CadastroPalavras.Java

public class CadastroPalavras extends ListActivity { 
protected static final int INSERIR_EDITAR = 1; 
protected static final int BUSCAR = 2; 
protected static final int EDITAR = 3; 

public static RepositorioPalavra repositorio; 

private List<Palavra> palavras; 

@Override 
public void onCreate(Bundle icicle) { 
    super.onCreate(icicle); 
    repositorio = new RepositorioPalavraScript(this); 
    atualizarLista(); 
} 

protected void atualizarLista() { 
    // Pega a lista de carros e exibe na tela 
    palavras = repositorio.listarPalavras(); 

    // Adaptador de lista customizado para cada linha de um carro 
    setListAdapter(new PalavraListAdapter(this, palavras)); 
} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    super.onCreateOptionsMenu(menu); 
    menu.add(0, INSERIR_EDITAR, 0, "Adicionar").setIcon(R.drawable.novo); 
    menu.add(0, BUSCAR, 0, "Buscar").setIcon(R.drawable.pesquisar); 
    menu.add(0, EDITAR, 0, "Editar").setIcon(R.drawable.novo); 
    return true; 
} 

@Override 
public boolean onMenuItemSelected(int featureId, MenuItem item) { 
    // Clicou no menu 
    switch (item.getItemId()) { 
    case INSERIR_EDITAR: 
     // Abre a tela com o formulário para adicionar 
     startActivityForResult(new Intent(this, Adicionar.class), INSERIR_EDITAR); 
     break; 
    case BUSCAR: 
     // Abre a tela para buscar o carro pelo nome 
     startActivity(new Intent(this, BuscarPalavra.class)); 
     break; 
    case EDITAR: 
     // Abre a tela para buscar o carro pelo nome 
     startActivity(new Intent(this, Editar.class)); 
     break; 
    } 
    return true; 
} 

@Override 
protected void onListItemClick(ListView l, View v, int posicao, long id) { 
    super.onListItemClick(l, v, posicao, id); 
    editarPalavra(posicao); 
} 

// Recupera o id do carro, e abre a tela de edição 
protected void editarPalavra(int posicao) { 
    // Usuário clicou em algum carro da lista 
    // Recupera o carro selecionado 
    Palavra palavra = palavras.get(posicao); 
    // Cria a intent para abrir a tela de editar 
    Intent it = new Intent(this, DetalhePalavra.class); 
    // Passa o id do carro como parâmetro 
    it.putExtra(Palavras._ID, palavra.id); 
    // Abre a tela de edição 
    startActivityForResult(it, INSERIR_EDITAR); 
} 

@Override 
protected void onActivityResult(int codigo, int codigoRetorno, Intent it) { 
    super.onActivityResult(codigo, codigoRetorno, it); 

    // Quando a activity EditarCarro retornar, seja se foi para adicionar vamos atualizar a lista 
    if (codigoRetorno == RESULT_OK) { 
     // atualiza a lista na tela 
     atualizarLista(); 
    } 
} 

@Override 
protected void onDestroy() { 
    super.onDestroy(); 

    // Fecha o banco 
    repositorio.fechar(); 
} 
} 

PalavraListAdapter.Java

public class PalavraListAdapter extends BaseAdapter { 
private Context context; 
private List<Palavra> lista; 

public PalavraListAdapter(Context context, List<Palavra> lista) { 
    this.context = context; 
    this.lista = lista; 
} 

public int getCount() { 
    return lista.size(); 
} 

public Object getItem(int position) { 
    return lista.get(position); 
} 

public long getItemId(int position) { 
    return position; 
} 

public View getView(int position, View convertView, ViewGroup parent) { 
    // Recupera o Carro da posição atual 
    Palavra c = lista.get(position); 

    LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    View view = inflater.inflate(R.layout.palavra_linha_tabela, null); 

    // Atualiza o valor do TextView 
    TextView word = (TextView) view.findViewById(R.id.word); 
    word.setText(c.word); 



    return view; 
} 

}

EditarPalavra.Java

public class EditarPalavra extends Activity { 
static final int RESULT_SALVAR = 1; 
static final int RESULT_EXCLUIR = 2; 
static final int RESULT_APAGAR = 3; 

// Campos texto 
private EditText campoWord; 
private EditText campoDefinition; 
private EditText campoExample; 
private Long id; 

@Override 
protected void onCreate(Bundle icicle) { 
    super.onCreate(icicle); 

    setContentView(R.layout.form_editar_palavra); 

    campoWord = (EditText) findViewById(R.id.campoWord); 
    campoDefinition = (EditText) findViewById(R.id.campoDefinition); 
    campoExample = (EditText) findViewById(R.id.campoExample); 

    id = null; 

    Bundle extras = getIntent().getExtras(); 
    // Se for para Editar, recuperar os valores ... 
    if (extras != null) { 
     id = extras.getLong(Palavras._ID); 

     if (id != null) { 
      // é uma edição, busca o carro... 
      Palavra c = buscarPalavra(id); 
      campoWord.setText(c.word); 
      campoDefinition.setText(c.definition); 
      campoExample.setText(String.valueOf(c.example)); 
     } 
    } 

    ImageButton btCancelar = (ImageButton) findViewById(R.id.btCancelar); 
    btCancelar.setOnClickListener(new OnClickListener() { 
     public void onClick(View view) { 
      setResult(RESULT_CANCELED); 
      // Fecha a tela 
      finish(); 
     } 
    }); 

    // Listener para salvar o carro 
    ImageButton btSalvar = (ImageButton) findViewById(R.id.btSalvar); 
    btSalvar.setOnClickListener(new OnClickListener() { 
     public void onClick(View view) { 
      salvar(); 
     } 
    }); 




    ImageButton btExcluir = (ImageButton) findViewById(R.id.btExcluir); 

    if (id == null) { 
     // Se id está nulo, não pode excluir 
     btExcluir.setVisibility(View.INVISIBLE); 
    } else { 
     // Listener para excluir o carro 
     btExcluir.setOnClickListener(new OnClickListener() { 
      public void onClick(View view) { 
       excluir(); 
      } 
     }); 


    } 
} 

@Override 
protected void onPause() { 
    super.onPause(); 
    // Cancela para não ficar nada na tela pendente 
    setResult(RESULT_CANCELED); 

    // Fecha a tela 
    finish(); 
} 

public void salvar() { 


    Palavra palavra = new Palavra(); 
    if (id != null) { 
     // É uma atualização 
     palavra.id = id; 
    } 
    palavra.word = campoWord.getText().toString(); 
    palavra.definition = campoDefinition.getText().toString(); 
    palavra.example = campoExample.getText().toString(); 

    // Salvar 
    salvarPalavra(palavra); 

    // OK 
    setResult(RESULT_OK, new Intent()); 

    // Fecha a tela 
    finish(); 
} 

public void excluir() { 
    if (id != null) { 
     excluirPalavra(id); 
    } 

    // OK 
    setResult(RESULT_OK, new Intent()); 

    // Fecha a tela 
    finish(); 
} 

// Buscar o carro pelo id 
protected Palavra buscarPalavra(long id) { 
    return CadastroPalavras.repositorio.buscarPalavra(id); 
} 

// Salvar o carro 
protected void salvarPalavra(Palavra palavra) { 
    CadastroPalavras.repositorio.salvar(palavra); 
} 

// Excluir o carro 
protected void excluirPalavra(long id) { 
    CadastroPalavras.repositorio.deletar(id); 
} 
} 

回答