2016-09-14 5 views
7

вставить Uri изображение в SQLite, используя ниже код:EditText afterTextChanged не работает

Регистрация

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(); 
    } 

Как я получаю Database Created, я предполагаю, что база данных была успешно создана и были вставлены данные.

В Войти, я хочу, чтобы изображение было получено от SQLite на основе имени пользователя.

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(); 
    } 
} 

После того как пользователь введите его/ее имя на EditText, которую назвали name, изображение не загружается, но отображение Null сообщение мне! Что здесь не так?

+0

Посмотрите на это http://stackoverflow.com/questions/11790104/how-to-storebitmap-image-and-retrieve-image-from-sqlite-database-in-android –

+0

Слушатель текстового наблюдателя вызовет событие afterTextChanged в каждом изменении текстового изменения. В вашем случае вы можете вызывать предложение выбора несколько раз (с personName = 'u', personName = 'us' ...). – Guille89

+0

Каков правильный способ реализации этого? –

ответ

5

Для EditText afterTextChanged() будет вызываться каждый раз, когда происходит изменение текста, обнаруженное TextWatcher(). Каждый символ, набранный в EditText, является событием textChange.

Из-за этого даже до ввода всего имени пользователя afterTextChanged() вызывается несколько раз и, следовательно, пустого курсора. Однако, как только имя пользователя будет полностью набрано, курсор должен указать правильную строку, в вашем случае, капли изображения.

Как вы упомянули, это страница входа в систему, поэтому должен быть пароль editText вместе с именем пользователя editText.

Лучшим способом, который я бы предложил, является обнаружение изменения фокуса имени пользователя EditText с использованием setOnFocusChangeListener(). Окуните запрос Sql, как только пользователь завершит ввод имени пользователя, и теперь основное внимание будет уделено паролю 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(); 
      } 
     } 
}); 

Сообщите нам, если это работает.

+0

Я закончил набирать имя, но изображение все еще не отображается, и я также не получил значение «null» –

+0

. Что делать, если я хочу, чтобы изображение отображалось после пользователь заканчивает печатать его имя, возможно ли это? –

+0

этот код будет работать, когда имя 'editText' потеряло фокус, а не когда пользователь закончит печатать. Код, который вы изначально используете, должен также работать, когда пользователь завершил ввод всего имени пользователя, прежде чем он будет продолжать показывать тост как «NULL». –

Смежные вопросы