【发布时间】:2017-10-12 18:54:56
【问题描述】:
我正在创建一个应用程序,我希望以后能够在不卸载应用程序的情况下更改图像。 由于我们无法写入可绘制文件夹,我想我使用数据库来保存图像,然后我可以在以后操作那里的数据。
我测试了一些代码,但它似乎不起作用。我可以从 url 中提取图像并显示。但我仍然无法弄清楚如何从 url 将图像放在数据库中。
看看我的代码。
public class MainActivity extends AppCompatActivity {
Intent intent;
Button btn;
DataBaseHandler db;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (android.os.Build.VERSION.SDK_INT > 9) {
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
}
btn = (Button)findViewById(R.id.btn);
final ImageView img = (ImageView)findViewById(R.id.img);
//initialize db
db = new DataBaseHandler(this);
URL url = null;
try {
url = new URL("https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQSh3goeAXlletPgkm3pm1F4DgxwArOKS9STyK02ocNn0AZ6Q9u");
} catch (MalformedURLException e) {
e.printStackTrace();
}
try {
url = new URL("https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQSh3goeAXlletPgkm3pm1F4DgxwArOKS9STyK02ocNn0AZ6Q9u");
final Bitmap image = BitmapFactory.decodeStream(url.openStream());
byte[]inpudata = Utils.getImageBytes(image);
db.insertImage(inpudata);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
byte[]inpudata = db.retreiveImageFromDB();
img.setImageBitmap(Utils.getImage(inpudata));
}
});
} catch(IOException e) {
System.out.println(e);
}
}
}
也是数据库助手类
public class DataBaseHandler{
public static final String IMAGE_ID = "id";
public static final String IMAGE = "image";
private final Context mContext;
private DatabaseHelper mDbHelper;
private SQLiteDatabase mDb;
private static final String DATABASE_NAME = "Images.db";
private static final int DATABASE_VERSION = 1;
private static final String IMAGES_TABLE = "ImagesTable";
private static final String CREATE_IMAGES_TABLE =
"CREATE TABLE " + IMAGES_TABLE + " (" +
IMAGE_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, "
+ IMAGE + " BLOB NOT NULL );";
private static class DatabaseHelper extends SQLiteOpenHelper {
DatabaseHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
public void onCreate(SQLiteDatabase db) {
db.execSQL(CREATE_IMAGES_TABLE);
}
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("DROP TABLE IF EXISTS " + CREATE_IMAGES_TABLE);
onCreate(db);
}
}
public void Reset() {
mDbHelper.onUpgrade(this.mDb, 1, 1);
}
public DataBaseHandler(Context ctx) {
mContext = ctx;
mDbHelper = new DatabaseHelper(mContext);
}
public DataBaseHandler open() throws SQLException {
mDb = mDbHelper.getWritableDatabase();
return this;
}
public void close() {
mDbHelper.close();
}
// Insert the image to the Sqlite DB
public void insertImage(byte[] imageBytes) {
ContentValues cv = new ContentValues();
cv.put(IMAGE, imageBytes);
mDb.insert(IMAGES_TABLE, null, cv);
}
// Get the image from SQLite DB
// We will just get the last image we just saved for convenience...
public byte[] retreiveImageFromDB() {
Cursor cur = mDb.query(true, IMAGES_TABLE, new String[]{IMAGE,},
null, null, null, null,
IMAGE_ID + " DESC", "1");
if (cur.moveToFirst()) {
byte[] blob = cur.getBlob(cur.getColumnIndex(IMAGE));
cur.close();
return blob;
}
cur.close();
return null;
}
}
【问题讨论】:
-
请改变主意:将图像保存在本地,并且不要用 BLOBS 膨胀您的数据库。仅存储图像路径。
-
或者,更好的是,甚至不用费心保存图像。只需存储 URL。
-
我需要能够离线访问图像..因此需要将其保存在数据库中...是的,我确实检查了其他线程,但没有得到我正在寻找的内容对于
标签: java android sqlite android-sqlite sqliteopenhelper