2016-09-14 17 views
7

tôi chèn hình ảnh vào UriSQLite bằng cách sử dụng mã dưới đây:EditText afterTextChanged không làm việc

Đăng ký

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

Như tôi đã nhận được Database Created, tôi giả sử cơ sở dữ liệu được tạo thành công và dữ liệu được chèn vào.

Trong Đăng nhập, tôi muốn hình ảnh được truy xuất từ ​​SQLite dựa trên tên người dùng.

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

Sau khi người dùng gõ/tên của mình trên EditText, mà tên name, hình ảnh không lấy, nhưng hiển thị Null tin nhắn cho tôi! Có gì sai ở đây?

+0

Hãy xem http://stackoverflow.com/questions/11790104/how-to-storebitmap-image-and-retrieve-image-from-sqlite-database-in-android –

+0

Trình nghe theo dõi văn bản này sẽ kích hoạt sự kiện afterTextChanged trong mọi thay đổi văn bản chỉnh sửa. Trong trường hợp của bạn, bạn có thể đang gọi câu được chọn nhiều lần (với personName = 'u', personName = 'us' ...). – Guille89

+0

Cách chính xác để thực hiện điều này là gì? –

Trả lời

5

Đối với EditText, afterTextChanged() sẽ được gọi mỗi khi có thay đổi văn bản được phát hiện bởi TextWatcher() tức là mọi ký tự được nhập trong EditText là sự kiện textChange.

Vì điều này, ngay cả trước khi toàn bộ tên người dùng được nhập afterTextChanged() được gọi nhiều lần và do đó con trỏ null. Tuy nhiên, ngay sau khi tên người dùng được nhập hoàn toàn, con trỏ sẽ cung cấp hàng phù hợp, trong trường hợp của bạn, hình ảnh blob.

Như bạn đã đề cập, đó là trang đăng nhập, vì vậy phải có một editText mật khẩu cùng với tên người dùng editText.

Cách tốt hơn tôi đề xuất là phát hiện thay đổi trọng tâm của tên người dùng EditText sử dụng setOnFocusChangeListener(). Kích hoạt truy vấn Sql ngay sau khi người dùng hoàn thành việc gõ tên người dùng và tiêu điểm bây giờ là trên editText mật khẩu.

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

Hãy cho chúng tôi biết nếu điều này có hiệu quả.

+0

Tôi đã nhập xong tên nhưng hình ảnh vẫn không hiển thị và tôi không nhận được 'null' cũng là –

+0

Nếu tôi muốn hình ảnh hiển thị sau người dùng hoàn thành gõ tên của mình, là nó có thể? –

+0

mã này sẽ hoạt động khi tên 'editText' bị mất tiêu điểm, không phải khi người dùng nhập xong. Mã mà bạn đang sử dụng ban đầu cũng sẽ hoạt động khi người dùng đã hoàn tất nhập toàn bộ tên người dùng, trước khi mã đó sẽ tiếp tục hiển thị bánh mì nướng là "NULL". –

Các vấn đề liên quan