1

連絡先をテキスト ボックスからデータベースに保存できるアプリを作成しました。連絡先は、入力された番号またはデフォルトの連絡先から取得されます。このアプリには約 5 つの編集テキストがあります。

ここでの問題は次のとおりです。最初に番号を入力して保存ボタンをクリックすると、番号が保存され、適切に取得されます。新しい番号に対して2回目に同じことをするとき。番号が保存されています。DB から番号を取得しようとすると、番号が表示されません。

トランザクション値を格納するためにゲッター メソッドとセッター メソッドを使用しています。

以下は、私が試して問題を解決したものです。

getter および setter メソッドを介して edittext からデータベースへ。

         Contacts contacts = new Contacts();
      //arrsendcontactsinverse is the arraylist which stores all the numbers

         contacts.setArrcontactsofbean(arrsendcontactsinverse);
         database.addContacts(contacts);

//データを取得するには、以下のコードを使用しています。

db = new DataBase(this);

    if(db.getContactsCount()>0)
    {
        Contacts contactFromDb = db.getContacts();

        contact1.setText(contactFromDb.getArrcontactsofbean().get(0));
        contact2.setText(contactFromDb.getArrcontactsofbean().get(1));
        contact3.setText(contactFromDb.getArrcontactsofbean().get(2));
        contact4.setText(contactFromDb.getArrcontactsofbean().get(3));
        contact5.setText(contactFromDb.getArrcontactsofbean().get(4));
    }
}

これは、DataBase.java 内のコードです。

public class DataBase extends SQLiteOpenHelper
{
private static final int DATABASE_VERSION = 1;
private static final String TABLE_CONTACTS = "ContactsTable";
private static final String KEY_CONTACT1 = "contact1";  //column name
private static final String KEY_CONTACT2 = "contact2";  //column name
private static final String KEY_CONTACT3 = "contact3";  //column name
private static final String KEY_CONTACT4 = "contact4";  //column name
private static final String KEY_CONTACT5 = "contact5";  //column name

ArrayList<String> arrcontactofdatabasehandler= new ArrayList<String>();

public Databasehandler(Context context) 
{
    super(context, DATABASE_NAME, null, DATABASE_VERSION);
}

public void onCreate(SQLiteDatabase db)
{
    String CREATE_CONTACTS_TABLE = "CREATE TABLE " + TABLE_CONTACTS +"("
            +KEY_CONTACT1+ " TEXT," 
            +KEY_CONTACT2+ " TEXT,"
            +KEY_CONTACT3+ " TEXT,"
            +KEY_CONTACT4+ " TEXT,"
            +KEY_CONTACT5+ " TEXT,"
            + ")";
    db.execSQL(CREATE_CONTACTS_TABLE);
}

// Adding new contact
void addContacts(Contacts contacts)
{
    SQLiteDatabase db = this.getWritableDatabase();
    ContentValues values = new ContentValues();

    values.put(KEY_CONTACT1,contacts.getArrcontactsofbean().get(0));
    values.put(KEY_CONTACT2,contacts.getArrcontactsofbean().get(1));
    values.put(KEY_CONTACT3,contacts.getArrcontactsofbean().get(2));
    values.put(KEY_CONTACT4,contacts.getArrcontactsofbean().get(3));
    values.put(KEY_CONTACT5,contacts.getArrcontactsofbean().get(4));

        db.insert(TABLE_CONTACTS, null, values);
    db.close();
}

// Getting contacts
Contacts getContacts()
{
    String selectQuery = "SELECT  * FROM " + TABLE_CONTACTS;
    SQLiteDatabase db = this.getWritableDatabase();
    Cursor cursor = db.rawQuery(selectQuery, null);
    Contacts contacts = new Contacts();

    // looping through all rows and adding to list
    if (cursor.moveToFirst()) 
    {
        do 
        {
            arrcontactofdatabasehandler.add(cursor.getString(0));       
            arrcontactofdatabasehandler.add(cursor.getString(1));   
            arrcontactofdatabasehandler.add(cursor.getString(2));   
            arrcontactofdatabasehandler.add(cursor.getString(3));   
            arrcontactofdatabasehandler.add(cursor.getString(4));       

        } while (cursor.moveToNext());
    }
    contacts.setArrcontactsofbean(arrcontactofdatabasehandler);
    cursor.close();
    db.close();
    return contacts;
}

public int getContactsCount() 
{
    String countQuery = "SELECT  * FROM " + TABLE_CONTACTS;
    SQLiteDatabase db = this.getReadableDatabase();
    Cursor cursor = db.rawQuery(countQuery, null);
    int count = cursor.getCount();
    cursor.close();
    // return count
    db.close();
            return count;
}

public void dropTable()
{
    SQLiteDatabase db = this.getWritableDatabase();
    db.execSQL("DROP TABLE IF EXISTS " + TABLE_CONTACTS);
    String CREATE_CONTACTS_TABLE = "CREATE TABLE " + TABLE_CONTACTS +"("
            +KEY_CONTACT1+ " TEXT," 
            +KEY_CONTACT2+ " TEXT,"
            +KEY_CONTACT3+ " TEXT,"
            +KEY_CONTACT4+ " TEXT,"
            +KEY_CONTACT5+ " TEXT,"
            + ")";
    db.execSQL(CREATE_CONTACTS_TABLE);
    db.close();
}

  }

Contacts.java.(これらは getter メソッドと setter メソッドです)

 public class Contacts 
{
    ArrayList<String> arrcontactsofbean= new ArrayList<String>();

public Contacts()
{

}

public ArrayList<String> getArrcontactsofbean() 
{   
    return arrcontactsofbean;
}

public void setArrcontactsofbean(ArrayList<String> arrcontactsofbean)
{
    this.arrcontactsofbean = arrcontactsofbean;
}
}

ここで正確な問題を見つけることができませんでした。

4

1 に答える 1

0

私の理解に関する限り。問題は getContacts メソッドにあると思います:

ロジックによると、Contacts メソッドの 1 つのオブジェクトには 5 つの連絡先が含まれるため、DB に保存されます。

しかし、それらを正しい方法で取得していないため、連絡先クラスの配列を作成する必要があり、個々の行には 5 つの連絡先が含まれます (列の数を反映します)。

したがって、次のようにします。

   // Getting contacts
   Contacts[] getContacts()
   {
       String selectQuery = "SELECT  * FROM " + TABLE_CONTACTS;
       SQLiteDatabase db = this.getWritableDatabase();
       Cursor cursor = db.rawQuery(selectQuery, null);
       int count = getContactsCount();

       **//here can you check if the count is greater than 0**
       Log.d("Database", "Count: " + count);

       Contacts contacts[] = new Contacts[count];



       int index = 0;
       // looping through all rows and adding to list
       if (cursor.moveToFirst()) 
       {
           do 
           {
               Log.d("Database", "Initializing contacts...");
               contacts[index] = new Contacts(); ///initialize contacts here 
               ArrayList<String> arr = new ArrayList<String>();
               arr.add(cursor.getString(0));       
               arr.add(cursor.getString(1));   
               arr.add(cursor.getString(2));   
               arr.add(cursor.getString(3));   
               arr.add(cursor.getString(4));       
               contacts[index].setArrcontactsofbean(arr);
               index++;

           } while (cursor.moveToNext());
       }

       cursor.close();
       db.close();
       return contacts;
   }

コードで結果を取得する方法、つまり配列を処理してから表示する方法を変更する必要があります。

「あなたが言ったように、arraylist メソッドを使用して値を取得しようとしましたが、null ポインター例外が発生しました。」?

結果をトラバースするには、以下のコードを試してください。

 Contacts contactsFromDb[];
 contactsFromDB = db.getContacts() /// Note the db is the object of Database class in which the getContacts() method is

 if(contactsDB != null){
    for(int k =0; k < contactsFromDB.length; k++){
    arrforcontactsdb = contactsFromDB[k].getArrcontactsofbean();

    for(int i = 0 ;i < (arrforcontactsdb.size());i++)   //not it should not be -1
    { 
        Log.e("retrieved VALUES ARE",""+arrforcontactsdb.get(i));
    }

"そして、database.java で配列の arraylist を使用している理由を教えていただけますか?"

答え:

Array の ArrayList ではありません....個々の連絡先を含む String の ArrayList です。各行に5つの連絡先が含まれるため、配列である理由1つの連絡先オブジェクトを表すため、複数の行は複数のオブジェクトを意味するため、取得中にそれらを配列に格納しました。

于 2013-03-15T10:53:01.847 に答える