EditText afterTextChanged not working: displays zero

I embed a Uri image in SQLite using the code below:

check in

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

As I get Database Created , I assume that the database was created successfully and the data was inserted.

In Login, I want to get an image from SQLite based on the username.

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

After the user types his name on EditText , which is named name , the image will not be extracted, but a Null message will be displayed to me! What is wrong here?

+7
android uri sqlite android-edittext imageview
source share
1 answer

For EditText, afterTextChanged() will be called every time there is a text change detected by TextWatcher() ie, every character entered in EditText is a textChange event.

Because of this, even before entering the entire username, afterTextChanged() is called several times and therefore an empty cursor. However, as soon as the username is fully typed, the cursor should indicate the correct line, in your case, a drop of image.

As you mentioned, this is the login page, so there must be an editText password along with the editText username.

The best way I would suggest is to detect the focus change of the EditText username with setOnFocusChangeListener() . Fry the Sql request as soon as the user completes the username and now the focus is on the editText password.

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

Let us know if this works.

+5
source share

All Articles