问题
hello all i am developing an android application which listen to incoming whatsapp notification and show it in listView using NotificationListenerService
. i need help in sqlite database to store notifications and retrieve data and show in listView. data is one Bitmap image and text string...
following is code am trying..
databaseHandler
public class DatabaseHandler extends SQLiteOpenHelper{
// Database Version
private static final int DATABASE_VERSION = 1;
// Database Name
private static final String DATABASE_NAME = "wnoti";
// table name
private static final String TABLE_NOTI = "noti";
//table attributes
private static final String KEY_ID = "id";
private static final String KEY_NAME = "name";
private static final String KEY_POTO = "poto";
public DatabaseHandler(Context context){
super(context,DATABASE_NAME,null,DATABASE_VERSION);
}
//create table
@Override
public void onCreate(SQLiteDatabase db){
String CREATE_TABLE=" CREATE TABLE "+TABLE_NOTI + "("
+ KEY_ID +" INTEGER PRIMARY KEY,"
+ KEY_NAME +" TEXT,"
+ KEY_POTO +" BLOB" + ")";
db.execSQL(CREATE_TABLE);
}
//upgrading database
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion){
// Drop older table if existed
db.execSQL("DROP TABLE IF EXISTS " + TABLE_NOTI);
// Create tables again
onCreate(db);
}
//Insert values to the table contacts
public void addContacts(Model model){
SQLiteDatabase db = this.getReadableDatabase();
ContentValues values=new ContentValues();
values.put(KEY_NAME, model.getName());
values.put(KEY_POTO, model.getImage());
db.insert(TABLE_NOTI, null, values);
db.close();
}
public List<Model> getAllnoti() {
List<Model> notiList = new ArrayList<Model>();
// Select All Query
String selectQuery = "SELECT * FROM " + TABLE_NOTI;
SQLiteDatabase db = this.getWritableDatabase();
Cursor cursor = db.rawQuery(selectQuery, null);
// looping through all rows and adding to list
if (cursor.moveToFirst()) {
do {
Model model = new Model();
model.setID(Integer.parseInt(cursor.getString(0)));
model.setName(cursor.getString(1));
model.setImage(cursor.getBlob(2));
// Adding notification to list
notiList.add(model);
} while (cursor.moveToNext());
}
// return notification list
return notiList;
}
}
my model class
1st when i am working without sqlite database i use Bitmap imaBitmap
then i change it to byte[]...
public class Model {
String name;
byte[] imaBitmap;
int _id;
public Model(){
}
public Model(int id,String name,byte[] imaBitmap)
{
this._id=id;
this.name=name;
this.imaBitmap=imaBitmap;
}
public Model(String name,byte[] imaBitmap){
this.name=name;
this.imaBitmap=imaBitmap;
}
// getting ID
public int getID(){
return this._id;
}
// setting id
public void setID(int id){
this._id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public byte[] getImage() {
return imaBitmap;
}
public void setImage(byte[] imaBitmap) {
this.imaBitmap = imaBitmap;
}
}
now here is the problem....
i just want this dataString title = intent.getStringExtra("title");
String text = intent.getStringExtra("text");
byte[] byteArray = intent.getByteArrayExtra("icon");
into my db my mind is totally blocked..................
public class MainActivity extends Activity {
private DatabaseHandler db;
ListView list;
CustomListAdapter adapter;
ArrayList<Model> modelList;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
modelList = new ArrayList<Model>();
adapter = new CustomListAdapter(getApplicationContext(), modelList);
list = (ListView) findViewById(R.id.list);
list.setAdapter(adapter);
LocalBroadcastManager.getInstance(this).registerReceiver(onNotice, new IntentFilter("Msg"));
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.action_settings:
Intent intent = new Intent(
"android.settings.ACTION_NOTIFICATION_LISTENER_SETTINGS"
);
startActivity(intent);
return true;
default:
return super.onOptionsItemSelected(item);
}
}
private BroadcastReceiver onNotice = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
// String pack = intent.getStringExtra("package");
String title = intent.getStringExtra("title");
String text = intent.getStringExtra("text");
//int id =intent.getIntExtra("icon",0);
Context remotePackageContext = null;
try {
// remotePackageContext =
getApplicationContext().createPackageContext(pack, 0);
// Drawable icon =
remotePackageContext.getResources().getDrawable(id);
// if(icon !=null) {
// ((ImageView)
findViewById(R.id.imageView)).setBackground(icon);
//}
byte[] byteArray = intent.getByteArrayExtra("icon");
// Bitmap bmp = null;
// if (byteArray != null) {
// bmp = BitmapFactory.decodeByteArray(byteArray, 0, byteArray.length);
// }
Model model = new Model();
// model.setName(title + "" + text);
// model.setImage(byteArray);
db.addContacts(new Model(title + "" + text,byteArray));
Toast.makeText(getApplicationContext(),"Saved ",Toast.LENGTH_LONG).show();
if (modelList != null) {
modelList.add(model);
adapter.notifyDataSetChanged();
} else {
modelList = new ArrayList<Model>();
modelList.add(model);
adapter = new CustomListAdapter(getApplicationContext(), modelList);
list = (ListView) findViewById(R.id.list);
list.setAdapter(adapter);
}
} catch (Exception e) {
e.printStackTrace();
}
}
};
}
i think i am doing many things wrong i am learning android plz teach me
回答1:
If your image is really small you can covert it in a String
by means of android.util.Base64
encoding and put this string in SQLite
database:
public static String getPngAsString(Bitmap bitmap){
ByteArrayOutputStream bos = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.PNG, 0, bos);
byte[] bitmapBytes = bos.toByteArray();
return Base64.encodeToString(bitmapBytes, Base64.NO_WRAP);
}
回答2:
Storing Bitmap
images in a SQL is actually a bad idea.
My suggestion is to save you images online and save the URL link in the database.
You can take the URL from the database and show it in your app using Picasso
(link).
Also, remember to ask for internet permission in your app to load images from a url.
回答3:
Create a class by name BitmapBase64.class and use whereever you need. Either way of conversion can be done.
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.util.Base64;
import java.io.ByteArrayOutputStream;
public class BitmapBase64
{
public static Bitmap convert(String base64Str) throws IllegalArgumentException
{
byte[] decodedBytes = Base64.decode(
base64Str.substring(base64Str.indexOf(",") + 1),
Base64.DEFAULT
);
return BitmapFactory.decodeByteArray(decodedBytes, 0, decodedBytes.length);
}
public static String convert(Bitmap bitmap)
{
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.PNG, 100, outputStream);
return Base64.encodeToString(outputStream.toByteArray(), Base64.DEFAULT);
}
}
Usage :
Bitmap bitmap = BitmapBase64.convert(BASE_64_STRING);
String base64String = BitmapBase64.convert(BITMAP);
But this is suggested if the image is small, if not go with online storage and retrieval. Be careful with out of memory as well as this is quite often when your dealing with bitmaps.
来源:https://stackoverflow.com/questions/49715427/how-to-implement-sqlite-database-to-store-bitmap-image-and-text