-2

アプリの概要: 連絡先の追加 / 連絡先の編集

- Contato.java//連絡先の ListView を表示します。itemClicked が info(name/telephone) と 3Buttons (Ok/Alter/Delete) のダイアログを表示すると、Alterボタンはユーザーを次の場所に送ります:

-Adicionarcontato.java編集する情報がありますが、編集して「Salvar」(保存)ボタンを押すと、エラーが発生します:The application Mensagem(process com.example.mensagem) has stopped unexpectedly. Please try again.

ListView の Contato.java のコードです。

 private void ListaContatos(){      
    ListView user = (ListView) findViewById(R.id.lvShowContatos);
    //String = simple value ||| String[] = multiple values/columns
    String[] campos = new String[] {"nome", "telefone"};

    list = new ArrayList<String>();
    c = db.query( "contatos", campos, null, null, null, null, null);
    c.moveToFirst();
    if(c.getCount() > 0) {
        while(true) {
           list.add(c.getString(c.getColumnIndex("nome")).toString());
           if(!c.moveToNext()) break;
        }
    }

    ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
            android.R.layout.simple_list_item_1, list);

    user.setAdapter(adapter);

    user.setOnItemClickListener(new OnItemClickListener() {
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            reg = position;
            c.moveToPosition(reg);
            String nome = c.getString(c.getColumnIndex("nome"));
            String telefone = c.getString(c.getColumnIndex("telefone"));
            ShowMessage(nome, telefone);

        }
    });

}

Adicionarcontato.java のコードは次のとおりです。

 public SQLiteDatabase db;
private String mIndex = "";
private String nomeant,foneant;
static final String userTable = "contatos";

@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    setContentView(R.layout.adicionarcontato);
    if(getIntent().getExtras() != null) {
        if(getIntent().getExtras().containsKey("reg")) mIndex = getIntent().getExtras().getString("reg");
    }
    db = openOrCreateDatabase("banco.db", Context.MODE_WORLD_WRITEABLE, null);
    if(!mIndex.equals("")) {
        Cursor c = db.query(false, "contatos", (new String[] {"nome", "telefone"}), null, null, null, null, null, null);
        c.moveToPosition(Integer.parseInt(mIndex));
        nomeant = c.getString(0);
        foneant = c.getString(1);
        EditText nome1 = (EditText) findViewById(R.id.etNome);
        EditText telefone1 = (EditText) findViewById(R.id.etTelefone);
        nome1.setText(nomeant);
        telefone1.setText(foneant);
    }

    AdicionarContato();
    ResetarInfo();      
}

クリックしたときのボタン「Salvar」のコード:

  public void AdicionarContato() {
    // TODO Auto-generated method stub

       final EditText nm = (EditText) findViewById(R.id.etNome);
       final EditText tlf = (EditText) findViewById(R.id.etTelefone);


    Button add = (Button) findViewById(R.id.bSalvarContato);
    add.setOnClickListener(new OnClickListener() {

        public void onClick(View v) {
            // TODO Auto-generated method stub

            final String nome = nm.getText().toString();
            final String telefone = tlf.getText().toString();
            if(nome.length() != 0 && telefone.length() != 0){
                if(mIndex.equals("")) {                 
                    ContentValues valor = new ContentValues();
                    valor.put("nome", nome);
                    valor.put("telefone", telefone);
                    db.insert("contatos", null, valor);
                    ShowMessage("Sucesso","O Contato " + nome + " foi salvo com sucesso");
                }
                else {
                    String[] whereArgs = {"nome", "telefone"};

                    ContentValues dataToInsert = new ContentValues();                          
                    dataToInsert.put("nome", nome);
                    dataToInsert.put("telefone", telefone);

                    db.update("contatos", dataToInsert, "nome='"+nomeant+" and telefone='"+foneant+"'", whereArgs);
                    ShowMessage("Sucesso","O Contato " + nome + " foi salvo com sucesso");
                }
            }
        }
    });
}

LogCat エラーは、次のことを示しています。 Failure 1 (table contatos already exists) on 0x2205b0 when preparing 'create table contatos(nome varchar(50),telefone varchar(20))'.

私のPOV:LogCatの結果は、テーブルがすでに存在することを示していますが、コードでは、作成しようとしていることを示している場所がわかりません。間違って、接続しようとしましたが、作成しませんでした。

4

2 に答える 2

1

where 句自体に引数を追加しているため、ここでは whereArgs は必要ありません。whereArgs の代わりに null を指定するだけです -

db.update("contatos", dataToInsert, "nome='"+nomeant+"' and telefone='"+foneant+"'", null);

ただし、常に引数を使用する方が適切です。SQL インジェクションを防ぎ、特殊文字のエスケープも処理します。あなたの場合 -

db.update("contatos", dataToInsert, "nome=? and telefone=?", whereArgs);

また、あなたの whereArgs が間違っています。そのはず -

String[] whereArgs = new String[] {nomeant, foneant};

ユーザーからのFONTMukesh Soni

于 2012-10-01T16:35:26.713 に答える
0

また、whereArgs を使用すると SQLite の最適化が可能になります。コードの別の問題は、更新操作と挿入操作の戻り値をチェックしないことです。

db.update("contatos", dataToInsert, "nome='"+nomeant+"' and telefone='"+foneant+"'", null);  

db.insert("contatos", null, valor); 

操作が成功した場合は、 update と insert の戻り値をチェックして、操作が実際に成功したかどうかを確認する必要があります。

良い出発点として、Android の SQLite に関するこの優れたチュートリアルも確認してください。

于 2012-10-01T22:00:14.520 に答える