2016-09-14 4 views
7

I Uri Bild in SQLite unter Verwendung von Code unten ein:EditText afterTextChanged nicht funktioniert

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

Wie ich immer Database Created, gehe ich davon wurde Datenbank erfolgreich erstellt und die Daten eingefügt wurden.

In Login, ich möchte das Bild von SQLite basierend auf Benutzername abgerufen.

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

Nachdem der Benutzer auf EditText seinen/ihren Namen geben, die name genannt, das Abrufen das Bild nicht, sondern die Anzeige Null Nachricht an mich! Was ist hier falsch?

+0

Werfen Sie einen Blick auf diese http://stackoverflow.com/questions/11790104/how-to-storebitmap-image-and-retrieve-image-from-sqlite-database-in-android –

+0

Ein Text Watcher Listener wird ausgelöst Das afterTextChanged-Ereignis in jedem Bearbeitungstext ändert sich. In Ihrem Fall können Sie den ausgewählten Satz mehrere Male aufrufen (mit personName = 'u', personName = 'us' ...). – Guille89

+0

Was ist der richtige Weg dies zu implementieren? –

Antwort

5

Bei einem EditText wird die afterTextChanged() jedes Mal aufgerufen, wenn eine Textänderung von TextWatcher() erkannt wird, d. H. Jedes im EditText eingegebene Zeichen ist ein textChange-Ereignis.

Aus diesem Grund, noch bevor der gesamte Benutzername eingegeben wird, wird die afterTextChanged() mehrmals aufgerufen und damit der Null-Cursor. Sobald der Benutzername vollständig eingegeben wurde, sollte der Cursor jedoch die richtige Zeile enthalten, in Ihrem Fall den Bild-Blob.

Wie Sie bereits erwähnt haben, ist es eine Anmeldeseite, daher muss ein Passwort editText zusammen mit dem Benutzernamen editText vorhanden sein.

Eine bessere Möglichkeit, die ich vorschlagen würde, ist die Erkennung der Fokusänderung des Benutzernamens EditText mit setOnFocusChangeListener(). Feuern Sie die Sql-Abfrage ab, sobald der Benutzer den Benutzernamen eingegeben hat und der Fokus auf dem Kennwort editText liegt.

Lassen Sie uns wissen, ob dies funktioniert.

+0

Ich habe den Namen eingegeben, aber das Bild immer noch nicht angezeigt, und ich habe nicht die 'Null' auch –

+0

Was passiert, wenn ich das Bild nach angezeigt werden soll Benutzer beenden seinen Namen eingeben, ist es möglich? –

+0

Dieser Code funktioniert, wenn der Name 'editText' den Fokus verloren hat, nicht wenn der Benutzer die Eingabe beendet hat. Der Code, den Sie ursprünglich verwenden, sollte auch funktionieren, wenn der Benutzer die Eingabe des gesamten Benutzernamens abgeschlossen hat. Vorher wird Toast weiterhin als "NULL" angezeigt. –

Verwandte Themen