皆さんこんにちは。SQL データベースを使用して個人辞書を作成しました。そこで、アプリからのメイン アクティビティ (データベースに挿入された特定のデータの検索) の「リストビュー」を更新する検索フィールドとして「オートコンプリート テキストビュー」を追加したいと思います。ご覧のとおり、メイン アクティビティには、テーブルの WORDS (最初の列) のリストが表示されます。SQL データベースを使用して、textwatcher などの検索ボックスを作成する方法がわかりません。誰かが私を助けることができますか?私は初心者です!
ソースコード:
リポジトリPalavra.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;
}
}
エディタPalavra.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);
}
}