2016-09-14 56 views
7
Uri

wstawić obraz do SQLite za pomocą poniższego kodu:EditText afterTextChanged nie działa

Register

private void insertData(String name,String pass, Uri image) throws SQLiteException { 
     database = mdb.getWritableDatabase(); 
     ContentValues cv = new ContentValues(); 
     cv.put(MyDatabaseHelper.KEY_NAME, name); 
     cv.put(MyDatabaseHelper.KEY_PASSWORD, pass); 
     try { 
      database = mdb.getWritableDatabase(); 
      InputStream iStream = getContentResolver().openInputStream(image); 
      byte[] inputData = Utils.getBytes(iStream); 
      cv.put(MyDatabaseHelper.KEY_IMAGE,inputData); 
     }catch(IOException ioe) 
     { 
      Log.e(TAG, "<saveImageInDB> Error : " + ioe.getLocalizedMessage()); 
     } 
     database.insert(MyDatabaseHelper.TABLE_USER, null, cv); 
     Toast.makeText(getApplicationContext(),"Database Created",Toast.LENGTH_SHORT).show(); 
     database.close(); 
    } 

Jak się Database Created, zakładam, że baza danych została pomyślnie utworzony, a dane zostały wprowadzone.

W Zaloguj się, chcę obraz pobrany z SQLite na podstawie nazwy użytkownika.

name = (EditText) findViewById(R.id.name); 

name.addTextChangedListener(new TextWatcher() { 
    @Override 
    public void onTextChanged(CharSequence s, int start, int before, int count) { 
    } 

    @Override 
    public void beforeTextChanged(CharSequence s, int start, int count, int after) { 
    } 

    @Override 
    public void afterTextChanged(Editable editable) { 
     String personName = name.getText().toString(); 
     database = mdb.getWritableDatabase(); 
     String selectQuery = " SELECT " + MyDatabaseHelper.KEY_IMAGE + " FROM " + MyDatabaseHelper.TABLE_USER + " WHERE " + MyDatabaseHelper.KEY_NAME + " = ' " + personName + " ' "; 
     Cursor cursor = database.rawQuery(selectQuery, null); 
     if (cursor.moveToFirst()) { 
      byte[] blob = cursor.getBlob(cursor.getColumnIndex("Image")); 
      Log.e("A", blob+""); 
      cursor.close(); 
      mdb.close(); 
      imageView.setImageBitmap(getRoundedBitmap(Utils.getImage(blob))); 
     } 
     else 
     { 
      Toast.makeText(getApplication(),"NULL",Toast.LENGTH_SHORT).show(); 
     } 
    } 
}); 

    public Bitmap getRoundedBitmap(Bitmap bitmap){ 
    Bitmap circleBitmap = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), Bitmap.Config.ARGB_8888); 
    BitmapShader shader = new BitmapShader(bitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP); 
    Paint paint = new Paint(); 
    paint.setShader(shader); 
    paint.setAntiAlias(true); 
    Canvas c = new Canvas(circleBitmap); 
    c.drawCircle(bitmap.getWidth()/2, bitmap.getHeight()/2, bitmap.getWidth()/2, paint); 
    return circleBitmap; 
    } 

MyDatabaseHelper

public class MyDatabaseHelper extends SQLiteOpenHelper { 
    public static final int DATABASE_VERSION=1; 
    public static final String DATABASE_NAME="mm.db"; 
    public static final String TABLE_USER="User"; 
    public static final String KEY_NAME="Name"; 
    public static final String KEY_PASSWORD="Password"; 
    public static final String KEY_IMAGE="Image"; 
    public static final String ID="id"; 

    public void onCreate(SQLiteDatabase db) { 
     db.execSQL("create table " + TABLE_USER + " (" + ID + " INTEGER PRIMARY KEY ,Name TEXT,Password TEXT,Image BLOB)"); 
    } 

    public void onUpgrade(SQLiteDatabase db, int oldVersion,int newVersion) { 
     Log.w(MyDatabaseHelper.class.getName(), "Upgrading database from version" + oldVersion + "to" + newVersion + ",which will destroy all old data"); 
     db.execSQL("Drop TABLE IF EXISTS " + TABLE_USER); 
     onCreate(db); 
    } 

    public MyDatabaseHelper(Context context) 
    { 
     super(context, DATABASE_NAME,null,1); 
    } 
} 

Utils

public class Utils { 

    public static byte[] getImageBytes(Bitmap bitmap) { 
     ByteArrayOutputStream stream = new ByteArrayOutputStream(); 
     bitmap.compress(Bitmap.CompressFormat.PNG, 100, stream); 
     return stream.toByteArray(); 
    } 

    public static Bitmap getImage(byte[] image) { 
     return BitmapFactory.decodeByteArray(image, 0, image.length); 
    } 

    public static byte[] getBytes(InputStream inputStream) throws IOException { 
     ByteArrayOutputStream byteBuffer = new ByteArrayOutputStream(); 
     int bufferSize = 1024; 
     byte[] buffer = new byte[bufferSize]; 

     int len = 0; 
     while ((len = inputStream.read(buffer)) != -1) { 
      byteBuffer.write(buffer, 0, len); 
     } 
     return byteBuffer.toByteArray(); 
    } 
} 

Po użytkownik wpisać jego/jej imię na EditText, który nazwany name, obraz nie pobierania, ale wyświetlanie Null wiadomość do mnie! Co jest nie tak?

+0

Zapoznaj się z tym http://stackoverflow.com/questions/11790104/how-to-storebitmap-image-and-retrieve-image-from-sqlite-database-in-android –

+0

Uaktywnia się moduł nasłuchiwania obserwatora tekstu zdarzenie afterTextChanged w każdej zmianie tekstu edycji. W twoim przypadku możesz wywoływać wybrane zdanie wiele razy (z personName = 'u', personName = 'us' ...). – Guille89

+0

Jaki jest prawidłowy sposób wdrożenia tego? –

Odpowiedz

5

Dla EditText afterTextChanged() będzie wywoływane za każdym razem, gdy zostanie wykryta zmiana tekstu przez TextWatcher(), tzn. Każdy znak wpisany w EditText jest zdarzeniem textChange.

Z tego powodu, nawet przed wpisaniem całej nazwy użytkownika, afterTextChanged() jest wywoływane wiele razy, a tym samym zerowy kursor. Jednakże, gdy tylko nazwa użytkownika zostanie całkowicie wpisana, kursor powinien podać odpowiedni wiersz, w twoim przypadku obraz blob.

Jak wspomniano, jest to strona logowania, więc musi istnieć hasło editText wraz z nazwą użytkownika editText.

Lepszym sposobem, który sugerowałbym, jest wykrywanie zmiany ogniskowania nazwy użytkownika EditText przy użyciu setOnFocusChangeListener(). Odpal kwerendę sql, jak tylko użytkownik zakończy wpisywanie nazwy użytkownika, a fokus jest teraz na hasło editText.

name = (EditText) findViewById(R.id.name); 

name.setOnFocusChangeListener(new OnFocusChangeListener() {   
    public void onFocusChange(View v, boolean hasFocus) { 
     if(!hasFocus) {    //Fire Query when focus is lost 
      String personName = name.getText().toString(); 
      database = mdb.getWritableDatabase(); 
      String selectQuery = " SELECT " + MyDatabaseHelper.KEY_IMAGE + " FROM " + MyDatabaseHelper.TABLE_USER + " WHERE " + MyDatabaseHelper.KEY_NAME + " = ' " + personName + " ' "; 
      Cursor cursor = database.rawQuery(selectQuery, null); 
      if (cursor.moveToFirst()) { 
       byte[] blob = cursor.getBlob(cursor.getColumnIndex("Image")); 
       Log.e("A", blob+""); 
       cursor.close(); 
       mdb.close(); 
       imageView.setImageBitmap(getRoundedBitmap(Utils.getImage(blob))); 
      } 
      else 
      { 
       Toast.makeText(getApplication(),"NULL",Toast.LENGTH_SHORT).show(); 
      } 
     } 
}); 

Daj nam znać, jeśli to działa.

+0

Skończyłem wpisywać nazwę, ale obraz nadal nie wyświetla się, a nie dostałem 'null' również –

+0

Co jeśli chcę obraz wyświetlany po użytkownik kończy pisać swoje nazwisko, czy to możliwe? –

+0

ten kod będzie działał, gdy nazwa 'editText' straci fokus, a nie kiedy użytkownik zakończy pisanie. Kod, którego początkowo używasz, powinien również działać, gdy użytkownik zakończy wpisywanie całej nazwy użytkownika, przed czym będzie wyświetlał tosty jako "NULL". –