我是Android编程的初学者,我正在尝试在SQLite中存储不同书籍的信息和图像。我从网站上获得了以下代码的一部分。我能够存储信息,即书籍的作者和标题,但不知道如何存储图像。我编写了forBook.java和MySQLiteHelper.java的代码,但是不知道如何使用MainActivity.java中的SQLite语句来存储和插入图像。有人帮忙吗?
这是我的Book.java
public class Book {
int id;
String title;
String author;
byte[] image;
public Book(){}
public Book(int id,String title, String author, byte[] image) {
this.id=id;
this.title = title;
this.author = author;
this.image=image;
}
public Book(String title, String author,byte[] image) {
this.title = title;
this.author = author;
this.image=image;
}
//getters & setters
// getting ID
public int getId(){
return this.id;
}
// setting id
public void setId(int id){
this.id = id;
}
// getting title
public String getTitle(){
return this.title;
}
// setting title
public void setTitle(String title){
this.title = title;
}
// getting authorname
public String getAuthor(){
return this.author;
}
// setting authorname
public void setAuthor(String author){
this.author = author;
}
//getting image
public byte[] getImage() {
return this.image;
}
//setting image
public void setImage(byte[] image) {
this.image = image;
}
}
这是我的MySQLitehelper.java
public class MySQLiteHelper extends SQLiteOpenHelper {
// Database Version
private static final int DATABASE_VERSION = 1;
// Database Name
private static final String DATABASE_NAME = "BookDB";
// Books table name
private static final String TABLE_BOOKS = "books";
// Books Table Columns names
private static final String KEY_ID = "id";
private static final String KEY_TITLE = "title";
private static final String KEY_AUTHOR = "author";
private static final String KEY_IMAGE = "image";
public MySQLiteHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
// Creating Tables
@Override
public void onCreate(SQLiteDatabase db) {
// SQL statement to create book table
String CREATE_BOOK_TABLE = "CREATE TABLE" + TABLE_BOOKS+"("+ KEY_ID +" INTEGER PRIMARY KEY,"+ KEY_TITLE+" TEXT,"+ KEY_AUTHOR+ " TEXT," + KEY_IMAGE + " BLOB" + ")";
// create books table
db.execSQL(CREATE_BOOK_TABLE);
}
// Upgrading database
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// Drop older books table if existed
db.execSQL("DROP TABLE IF EXISTS" + TABLE_BOOKS );
// create fresh books table
this.onCreate(db);
}
//---------------------------------------------------------------------
//*** CRUD operations (create "add", read "get", update, delete) book + get all books + delete all books */
private static final String[] COLUMNS = {KEY_ID,KEY_TITLE,KEY_AUTHOR,KEY_IMAGE};
public void addBook(Book book){
// 1. get reference to writable DB
SQLiteDatabase db = this.getWritableDatabase();
// 2. create ContentValues to add key "column"/value
ContentValues values = new ContentValues();
values.put(KEY_TITLE, book.getTitle()); // get title
values.put(KEY_AUTHOR, book.getAuthor()); // get author
values.put(KEY_IMAGE, book.getImage()); // get author
// 3. insert
db.insert(TABLE_BOOKS, // table
null, //nullColumnHack
values); // key/value -> keys = column names/ values = column values
// 4. close
db.close();
}
public Book getBook(int id){
// 1. get reference to readable DB
SQLiteDatabase db = this.getReadableDatabase();
// 2. build query
Cursor cursor =
db.query(TABLE_BOOKS, // a. table
COLUMNS, // b. column names
" id = ?", // c. selections
new String[] { String.valueOf(id) }, // d. selections args
null, // e. group by
null, // f. having
null, // g. order by
null); // h. limit
// 3. if we got results get the first one
if (cursor != null)
cursor.moveToFirst();
// 4. build book object
Book book = new Book();
book.setId(Integer.parseInt(cursor.getString(0)));
book.setTitle(cursor.getString(1));
book.setAuthor(cursor.getString(2));
book.setImage(cursor.getBlob(3));
// 5. return book
return book;
}
// Get All Books
public List<Book> getAllBooks() {
List<Book> books = new LinkedList<Book>();
// 1. build the query
String query = "SELECT * FROM " + TABLE_BOOKS;
// 2. get reference to writable DB
SQLiteDatabase db = this.getWritableDatabase();
Cursor cursor = db.rawQuery(query, null);
// 3. go over each row, build book and add it to list
Book book = null;
if (cursor.moveToFirst()) {
do {
book = new Book();
book.setId(Integer.parseInt(cursor.getString(0)));
book.setTitle(cursor.getString(1));
book.setAuthor(cursor.getString(2));
book.setImage(cursor.getBlob(3));
// Add book to books
books.add(book);
} while (cursor.moveToNext());
}
// return books
return books;
}
// Updating single book
public int updateBook(Book book) {
// 1. get reference to writable DB
SQLiteDatabase db = this.getWritableDatabase();
// 2. create ContentValues to add key "column"/value
ContentValues values = new ContentValues();
values.put("title", book.getTitle()); // get title
values.put("author", book.getAuthor()); // get author
values.put("image", book.getImage()); // get image
// 3. updating row
return db.update(TABLE_BOOKS, //table
values, // column/value
KEY_ID+" = ?", // selections
new String[] { String.valueOf(book.getId()) }); //selection args
}
// Deleting single book
public void deleteBook(Book book) {
// 1. get reference to writable DB
SQLiteDatabase db = this.getWritableDatabase();
// 2. delete
db.delete(TABLE_BOOKS,
KEY_ID+" = ?",
new String[] { String.valueOf(book.getId()) });
// 3. close
db.close();
}
}
这是我的MainActivity.java
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
MySQLiteHelper db = new MySQLiteHelper(this);
/**
* CRUD Operations
* */
// add Books
Log.d("Inserting: ", "Inserting all Books..");
db.addBook(new Book("Android Application Development Cookbook", "Wei Meng Lee"));
db.addBook(new Book("Android Programming: The Big Nerd Ranch Guide", "Bill Phillips and Brian Hardy"));
db.addBook(new Book("Learn Android App Development", "Wallace Jackson"));
//Reading and getting all books
Log.d("Reading: ", "Reading all Books..");
List<Book> list = db.getAllBooks();
for (Book cn:list) {
String log = "Id: "+cn.getId()+" ,Title: " + cn.getTitle() + " ,Author: " + cn.getAuthor() + ",Image: "+ cn.getImage();
// Writing Contacts to log
Log.d("Name: ", log);
// delete one book
db.deleteBook(list.get(0));
}
}
}
答案 0 :(得分:2)
public void insertImg(int id , Bitmap img ) {
byte[] data = getBitmapAsByteArray(img); // this is a function
insertStatement_logo.bindLong(1, id);
insertStatement_logo.bindBlob(2, data);
insertStatement_logo.executeInsert();
insertStatement_logo.clearBindings() ;
}
public static byte[] getBitmapAsByteArray(Bitmap bitmap) {
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
bitmap.compress(CompressFormat.PNG, 0, outputStream);
return outputStream.toByteArray();
}
public Bitmap getImage(int i){
String qu = "select img from table where feedid=" + i ;
Cursor cur = db.rawQuery(qu, null);
if (cur.moveToFirst()){
byte[] imgByte = cur.getBlob(0);
cur.close();
return BitmapFactory.decodeByteArray(imgByte, 0, imgByte.length);
}
if (cur != null && !cur.isClosed()) {
cur.close();
}
return null ;
}
答案 1 :(得分:0)
要在数据库中存储Image,您需要将图像数据转换为二进制形式,并将其存储在数据库中,并且在检索图像时需要将其转换为Bitmap格式,但不建议这样做,因为存储图像数据库有点棘手和复杂,或者您可以将图像存储在SD卡中的文件夹中并仅存储数据库中的路径,无论如何,如果您仍想将图像存储在数据库中,您可以参考this question
答案 2 :(得分:0)
private String prepareImage(String imagepath) {
if (imagepath== null) {
return "";
}
BitmapFactory.Options options = new BitmapFactory.Options();
options.inPreferredConfig = Bitmap.Config.ARGB_8888;
Bitmap bitmap = BitmapFactory.decodeFile(imagepath, options);
bitmap = Bitmap.createScaledBitmap(bitmap, 50, 50, true);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.PNG, 50, baos);
bitmap.compress(Bitmap.CompressFormat.JPEG, 50, baos);
byte[] byteArray = baos.toByteArray();
String imageString = com.eg_lifestyle.utils.Base64
.encodeBytes(byteArray);
bitmap = null;
System.gc();
Runtime.getRuntime().gc();
return imageString;
}
我希望这对你有用..
答案 3 :(得分:0)
此代码适合我。你可以得到适当的解决方案
Uri selectedImage = data.getData();
ImageView imageView=(ImageView)this.findViewById(R.id.imageView1);
getContentResolver().notifyChange(selectedImage, null);
ContentResolver cr = getContentResolver();
Bitmap bitmap;
try {
bitmap = android.provider.MediaStore.Images.Media
.getBitmap(cr, selectedImage);
imageView.setImageBitmap(bitmap);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos);
byte[] b = baos.toByteArray();
String encodedImageString = Base64.encodeToString(b, Base64.DEFAULT);
byte[] bytarray = Base64.decode(encodedImageString, Base64.DEFAULT);
Bitmap bmimage = BitmapFactory.decodeByteArray(bytarray, 0,
bytarray.length);
myDb.execSQL("INSERT INTO imgtbl VALUES('"+encodedImageString+"');");
Cursor c= myDb.rawQuery("SELECT * FROM imgtbl", null);
c.moveToFirst();
String img=c.getString(0);
byte[] byarray = Base64.decode(img, Base64.DEFAULT);
Bitmap bmimg = BitmapFactory.decodeByteArray(byarray, 0,
byarray.length);
ImageView iv=(ImageView)findViewById(R.id.img2);
ImageView iv1=(ImageView)findViewById(R.id.img3);
iv.setImageBitmap(bmimg);
iv1.setImageBitmap(bmimg);
} catch (Exception e) {
Toast.makeText(this, "Failed to load", Toast.LENGTH_SHORT)
.show();
e.printStackTrace();
}