2014-06-18 3 views
0

sqllite 데이터베이스와 연결된 사용자 지정보기와 관련된 응용 프로그램을 만들려고합니다. 이미지도 함께 구성됩니다.이미지 및 데이터베이스 연결이있는 사용자 지정 목록보기

문제점 : 에뮬레이터에서 프로그램을 실행하려고하면 프로그램을 실행할 때마다 아이콘 (이미지)이 반복적으로 발생하는 것으로 나타납니다. 예를 들어 내 프로그램은 facebook.png로 구성됩니다. 처음 실행될 때 한 이미지 만 표시됩니다. 실행하려고 시도 할 때마다 두 개의 Facebook 아이콘이 나타납니다. 어떻게이 문제를 해결 제거

코드는 다음과 같다 :

MainActivity.java

package com.example.sqlliteimagedemo; 

import java.io.ByteArrayOutputStream; 
import java.util.ArrayList; 
import java.util.List; 

import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.os.Bundle; 
import android.support.v7.app.ActionBarActivity; 
import android.util.Log; 
import android.widget.ListView; 

public class MainActivity extends ActionBarActivity 
{ 

    ArrayList<Contact> imageArry = new ArrayList<Contact>(); 
    ContactImageAdapter adapter; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     DataBaseHandler db = new DataBaseHandler(this); 
     // get image from drawable 
     Bitmap image = BitmapFactory.decodeResource(getResources(),R.drawable.facebook); 

     // convert bitmap to byte 
       ByteArrayOutputStream stream = new ByteArrayOutputStream(); 
       image.compress(Bitmap.CompressFormat.JPEG, 50, stream); 
       byte imageInByte[] = stream.toByteArray(); 
       /** 
       * CRUD Operations 
       * */ 
       // Inserting Contacts 
       Log.d("Insert: ", "Inserting .."); 
       db.addContact(new Contact("FaceBook", imageInByte)); 
       // display main List view bcard and contact name 

       // Reading all contacts from database 
       List<Contact> contacts = db.getAllContacts(); 
       for (Contact cn : contacts) { 
        String log = "ID:" + cn.getID() + " Name: " + cn.getName() 
          + " ,Image: " + cn.getImage(); 

        // Writing Contacts to log 
        Log.d("Result: ", log); 
        //add contacts data in arrayList 
        imageArry.add(cn); 

       } 
       adapter = new ContactImageAdapter(this, R.layout.screen_list, 
         imageArry); 
       ListView dataList = (ListView) findViewById(R.id.list); 
       dataList.setAdapter(adapter); 

      } 

     } 

에게 ContactImageAdapter.java

package com.example.sqlliteimagedemo; 

    import java.io.ByteArrayInputStream; 
    import java.util.ArrayList; 
    import android.app.Activity; 
    import android.content.Context; 
    import android.graphics.Bitmap; 
    import android.graphics.BitmapFactory; 
    import android.view.LayoutInflater; 
    import android.view.View; 
    import android.view.ViewGroup; 
    import android.widget.ArrayAdapter; 
    import android.widget.ImageView; 
    import android.widget.TextView; 

    public class ContactImageAdapter extends ArrayAdapter<Contact> 
    { 

     Context context; 
     int layoutResourceId; 
     // BcardImage data[] = null; 
     ArrayList<Contact> data=new ArrayList<Contact>(); 
     public ContactImageAdapter(Context context,int layoutResourceId, ArrayList<Contact> data) { 
      super(context, layoutResourceId, data); 

      this.layoutResourceId = layoutResourceId; 
       this.context = context; 
       this.data = data; 
      } 

     @Override 
     public View getView(int position, View convertView, ViewGroup parent) { 
      View row = convertView; 
      ImageHolder holder = null; 

      if(row == null) 
      { 
       LayoutInflater inflater = ((Activity) context).getLayoutInflater(); 
       row = inflater.inflate(layoutResourceId, parent, false); 

       holder = new ImageHolder(); 
       holder.txtTitle = (TextView)row.findViewById(R.id.txtTitle); 
       holder.imgIcon = (ImageView)row.findViewById(R.id.imgIcon); 
       row.setTag(holder); 
      } 
      else 
      { 
       holder = (ImageHolder)row.getTag(); 
      } 

      Contact picture = data.get(position); 
      holder.txtTitle.setText(picture._name); 
      //convert byte to bitmap take from contact class 

      byte[] outImage=picture._image; 
      ByteArrayInputStream imageStream = new ByteArrayInputStream(outImage); 
      Bitmap theImage = BitmapFactory.decodeStream(imageStream); 
      holder.imgIcon.setImageBitmap(theImage); 
      return row; 

     } 

     static class ImageHolder 
     { 
      ImageView imgIcon; 
      TextView txtTitle; 
     } 
    } 

DataBaseHandler.java

package com.example.sqlliteimagedemo; 

import java.util.ArrayList; 
import java.util.List; 

import android.content.ContentValues; 
import android.content.Context; 
import android.database.Cursor; 
import android.database.sqlite.SQLiteDatabase; 
import android.database.sqlite.SQLiteOpenHelper; 

public class DataBaseHandler extends SQLiteOpenHelper 
{ 
    // All Static variables 
     // Database Version 
     private static final int DATABASE_VERSION = 1; 

     // Database Name 
     private static final String DATABASE_NAME = "imagedb"; 

     // Contacts table name 
     private static final String TABLE_CONTACTS = "contacts"; 

     // Contacts Table Columns names 
     private static final String KEY_ID = "id"; 
     private static final String KEY_NAME = "name"; 
     private static final String KEY_IMAGE = "image"; 

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

     //creating tables 
    @Override 
    public void onCreate(SQLiteDatabase db) 
    { 
     String CREATE_CONTACTS_TABLE = "CREATE TABLE " + TABLE_CONTACTS + "(" 
       + KEY_ID + " INTEGER PRIMARY KEY," + KEY_NAME + " TEXT," 
       + KEY_IMAGE + " BLOB" + ")"; 
     db.execSQL(CREATE_CONTACTS_TABLE); 

    } 

    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) 
    { 

     //Drop older table if existed 
     db.execSQL("DROP TABLE IF EXISTS " + TABLE_CONTACTS); 

     // Create tables again 
     onCreate(db); 
    } 

    /** 
    * All CRUD(Create, Read, Update, Delete) Operations 
    */ 

    public// Adding new contact 
    void addContact(Contact contact) { 
     SQLiteDatabase db = this.getWritableDatabase(); 

     ContentValues values = new ContentValues(); 
     values.put(KEY_NAME, contact._name); // Contact Name 
     values.put(KEY_IMAGE, contact._image); // Contact Phone 

     // Inserting Row 
     db.insert(TABLE_CONTACTS, null, values); 
     db.close(); // Closing database connection 
    } 

    // Getting single contact 
    Contact getContact(int id) { 
     SQLiteDatabase db = this.getReadableDatabase(); 

     Cursor cursor = db.query(TABLE_CONTACTS, new String[] { KEY_ID, 
       KEY_NAME, KEY_IMAGE }, KEY_ID + "=?", 
       new String[] { String.valueOf(id) }, null, null, null, null); 
     if (cursor != null) 
      cursor.moveToFirst(); 

     Contact contact = new Contact(Integer.parseInt(cursor.getString(0)), 
       cursor.getString(1), cursor.getBlob(1)); 

     // return contact 
     return contact; 

    } 

    // Getting All Contacts 
    public List<Contact> getAllContacts() { 
     List<Contact> contactList = new ArrayList<Contact>(); 
     // Select All Query 
     String selectQuery = "SELECT * FROM contacts ORDER BY name"; 

     SQLiteDatabase db = this.getWritableDatabase(); 
     Cursor cursor = db.rawQuery(selectQuery, null); 
     // looping through all rows and adding to list 
     if (cursor.moveToFirst()) { 
      do { 
       Contact contact = new Contact(); 
       contact.setID(Integer.parseInt(cursor.getString(0))); 
       contact.setName(cursor.getString(1)); 
       contact.setImage(cursor.getBlob(2)); 
       // Adding contact to list 
       contactList.add(contact); 
      } while (cursor.moveToNext()); 
     } 
     // close inserting data from database 
     db.close(); 
     // return contact list 
     return contactList; 

    } 

    // Updating single contact 
    public int updateContact(Contact contact) { 
     SQLiteDatabase db = this.getWritableDatabase(); 

     ContentValues values = new ContentValues(); 
     values.put(KEY_NAME, contact.getName()); 
     values.put(KEY_IMAGE, contact.getImage()); 

     // updating row 
     return db.update(TABLE_CONTACTS, values, KEY_ID + " = ?", 
       new String[] { String.valueOf(contact.getID()) }); 

    } 

    // Deleting single contact 
    public void deleteContact(Contact contact) { 
     SQLiteDatabase db = this.getWritableDatabase(); 
     db.delete(TABLE_CONTACTS, KEY_ID + " = ?", 
       new String[] { String.valueOf(contact.getID()) }); 
     db.close(); 
    } 

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

     // return count 
     return cursor.getCount(); 
    } 

} 

activity_main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:orientation="vertical" > 

    <ListView 
     android:id="@+id/list" 
     android:layout_width="fill_parent" 
     android:layout_height="0dp" 
     android:layout_weight="0.55" > 
    </ListView> 

</LinearLayout> 

screen_list.xml

<?xml version="1.0" encoding="UTF-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:orientation="horizontal" 
    android:padding="10dp" > 

    <ImageView 
     android:id="@+id/imgIcon" 
     android:layout_width="0dp" 
     android:layout_height="100dp" 
     android:layout_weight="0.71" 
     android:gravity="center_vertical" /> 

    <TextView 
     android:id="@+id/txtTitle" 
     android:layout_width="80dp" 
     android:layout_height="fill_parent" 
     android:gravity="center_vertical" 
     android:textSize="14dp" 
     android:layout_marginLeft="7dp" /> 

</LinearLayout> 

제발 도와주세요 ..

답변

1

귀하의 추가 페이스 북의 접촉 Log.d("Insert: ", "Inserting .."); db.addContact(new Contact("FaceBook", imageInByte));를 사용하는 .

당신 코드는 다음과 같이 실행 : - 아래 참조

  • 당신이 실행 처음

    포인트, 하나의 페이스 북 덧붙였다.
  • 다시 프로그램을 실행하면 새 Facebook 연락처가 추가되었습니다. 두 개의 연락처를 보여줍니다. 이 프로그램

업데이트 된 코드 실행 때마다 추가 및 인쇄됩니다 현명한처럼

  • : -`

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState); 
        setContentView(R.layout.activity_main); 
    
        DataBaseHandler db = new DataBaseHandler(this); 
        // get image from drawable 
        Bitmap image = BitmapFactory.decodeResource(getResources(),R.drawable.facebook); 
    
        // convert bitmap to byte 
          ByteArrayOutputStream stream = new ByteArrayOutputStream(); 
          image.compress(Bitmap.CompressFormat.JPEG, 50, stream); 
          byte imageInByte[] = stream.toByteArray(); 
          /** 
          * CRUD Operations 
          * */ 
          // Inserting Contacts 
          Log.d("Insert: ", "Inserting .."); 
    
          //Added Code below 
          SharedPreferences preferences = getSharedPreferences("SETTINGS_PREF", Context.MODE_PRIVATE); 
          if(preferences.getBoolean("isFirstLaunch", true)){ 
           db.addContact(new Contact("FaceBook", imageInByte)); 
    
           SharedPreferences.Editor editor = preferences.edit(); 
           editor.putBoolean("isFirstLaunch", false); 
           editor.commit(); 
          } 
    
          // display main List view bcard and contact name 
    
          // Reading all contacts from database 
          List<Contact> contacts = db.getAllContacts(); 
          for (Contact cn : contacts) { 
           String log = "ID:" + cn.getID() + " Name: " + cn.getName() 
             + " ,Image: " + cn.getImage(); 
    
           // Writing Contacts to log 
           Log.d("Result: ", log); 
           //add contacts data in arrayList 
           imageArry.add(cn); 
    
          } 
          adapter = new ContactImageAdapter(this, R.layout.screen_list, 
            imageArry); 
          ListView dataList = (ListView) findViewById(R.id.list); 
          dataList.setAdapter(adapter); 
    
         } 
    
  • +0

    방금 ​​하나의 아이콘을 원합니다. – user3736518

    +0

    한 장만 추가하면됩니다. 그런 다음 SharedPrefrences를 사용하면 처음 실행시 isFirstLaunched = true로 설정할 수 있습니다. 두 번째 발급시 isFirstLaunched가 true인지 false인지 확인할 수 있습니다. 거짓 일 경우 추가 할 필요가 없습니다. –

    +0

    sharedPreferences를 사용하도록 코드를 업데이트하십시오. –

    0

    시도는 목록을 표시하기 전에이

    // Inserting Contacts 
           Log.d("Insert: ", "Inserting .."); 
           db.addContact(new Contact("FaceBook", imageInByte)); 
           // display main List view bcard and contact name 
    
    
           // ArrayList clear() operation removes all elements 
           imageArry.clear(); 
    
    
           // Reading all contacts from database 
           List<Contact> contacts = db.getAllContacts(); 
    
    +0

    imageArry.add (CN)를; onCreate에서 발생하고 onCreate를 사용하지 않으면 사용하지 않습니다. 그 경우에 onResume. imageArry.clear()는 좋은 습관입니다. –

    +1

    예 네 아이디어가 좋다 ... 나는 또한 우리가 bcz 거기에만 그는 arraylist를 지우기 위해 최선을 추가하기 전에 항목을 추가하려고 노력하고 있습니다 onCreate 바랍니다. 그래서 우리는 그걸 제안했습니다 ... 우리는 이력서에서도 사용할 수 있습니다 – Android

    관련 문제