2016-09-14 6 views
7

मैं SQLite में Uri छवि डालने: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

एक टेक्स्ट वॉचर श्रोता ट्रिगर करेगा प्रत्येक संपादन पाठ में परिवर्तन के बाद पाठ बदलें। अपने मामले में आप चुनिंदा वाक्य को कई बार कॉल कर सकते हैं (personName = 'u', personName = 'us' ...) के साथ। – Guille89

+0

इसे लागू करने का सही तरीका क्या है? –

उत्तर

5

एक संपादन टेक्स्ट के लिए afterTextChanged() को हर बार कॉल किया जाएगा जब TextWatcher() द्वारा टेक्स्ट परिवर्तन का पता चला है यानी एडिटटेक्स्ट में टाइप किए गए प्रत्येक वर्ण एक टेक्स्ट चेंज ईवेंट है।

इस वजह से, पूरे उपयोगकर्ता नाम टाइप किए जाने से पहले afterTextChanged() को कई बार और इस प्रकार शून्य कर्सर कहा जाता है। हालांकि, जैसे ही उपयोगकर्ता नाम पूरी तरह से टाइप किया जाता है, कर्सर को उचित स्थिति के साथ प्रदान करना चाहिए, आपके मामले में, छवि ब्लॉब।

जैसा कि आपने बताया है, यह एक लॉगिन पृष्ठ है, इसलिए उपयोगकर्ता नाम संपादन टेक्स्ट के साथ एक पासवर्ड संपादन टेक्स्ट होना चाहिए।

एक बेहतर तरीका जो मैं सुझाता हूं, setOnFocusChangeListener() का उपयोग कर उपयोगकर्ता नाम 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

मैंने नाम टाइप करना समाप्त कर दिया है, लेकिन छवि अभी भी प्रदर्शित नहीं हो रही है, और मुझे 'शून्य' भी नहीं मिला –

+0

क्या होगा यदि मैं छवि को प्रदर्शित करना चाहता हूं उपयोगकर्ता अपना नाम लिखना खत्म कर देता है, क्या यह संभव है? –

+0

यह कोड तब काम करेगा जब 'editText' नाम फोकस खो गया है, न कि जब उपयोगकर्ता टाइपिंग समाप्त करता है। जिस कोड का आप मूल रूप से उपयोग कर रहे हैं उसे तब भी काम करना चाहिए जब उपयोगकर्ता ने पूरे उपयोगकर्ता नाम टाइप करना पूरा कर लिया हो, इससे पहले कि यह टोस्ट को "न्यूल" के रूप में दिखाएगा। –

संबंधित मुद्दे