我使用下面的代码将Uri图像插入到sqlite中:
寄存器
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时,我假设数据库已成功创建并插入了数据.
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 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,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,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,len); } return byteBuffer.toByteArray(); } }
解决方法
对于EditText,每当TextWatcher()检测到文本更改时,将调用afterTextChanged(),即EditText中键入的每个字符都是textChange事件.
因此,即使在输入整个用户名之前,也会多次调用afterTextChanged(),从而调用null游标.但是,只要用户名被完全输入,光标就应该提供正确的行,在您的情况下,是图像blob.
正如您所提到的,它是一个登录页面,因此必须有一个密码editText以及用户名editText.
我建议更好的方法是使用setOnFocusChangeListener()检测用户名EditText的焦点更改.用户完成输入用户名后立即触发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(),Toast.LENGTH_SHORT).show(); } } });
如果有效,请告诉我们.