如何实现SQLite数据库来存储位图图像和文本?

时间:2018-04-08 07:14:22

标签: android listview android-sqlite notification-listener

你好我正在开发一个Android应用程序,它监听传入的whatsapp通知并使用NotificationListenerService在listView中显示它。我需要在sqlite数据库中提供帮助来存储通知并检索数据并在listView中显示。数据是一个位图图像和文本字符串... 以下是我正在尝试的代码..

数据库处理器

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 

当我在没有sqlite数据库的情况下工作时,我使用Bitmap imaBitmap 然后我把它改成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;
}
}

现在这里是问题.... 我只想要这个数据String title = intent.getStringExtra("title"); String text = intent.getStringExtra("text"); byte[] byteArray = intent.getByteArrayExtra("icon"); 进入我的数据库我的思绪完全被阻止..................

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

我认为我做了很多错事我正在学习android plz教我

3 个答案:

答案 0 :(得分:1)

如果您的图片非常小,您可以通过String编码将其隐藏在android.util.Base64中,并将此字符串放在SQLite数据库中

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

答案 1 :(得分:0)

在SQL中存储Bitmap图像实际上是错误的想法。

我的建议是在线保存图像并将URL链接保存在数据库中。

您可以使用Picassolink)从数据库中获取该网址并将其显示在您的应用中。

此外,请记得在您的应用中要求互联网许可,以便从网址加载图片。

答案 2 :(得分:0)

按名称 BitmapBase64.class 创建一个类,并根据需要使用它。无论哪种转换方式都可以完成。

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

用法:

Bitmap bitmap = BitmapBase64.convert(BASE_64_STRING);

String base64String = BitmapBase64.convert(BITMAP);

但是,如果图像很小,则建议使用,如果不是在线存储和检索。小心内存不足以及在处理位图时经常会这样。