【问题标题】:how to store image from url to sqlite?如何将图像从 url 存储到 sqlite?
【发布时间】:2015-02-28 10:14:06
【问题描述】:

抱歉,我是 adnroid 编程新手,我尝试组合 JSONParse 和 sqlite,当我将数据存储(插入)到 sqlite 时,我的列 image = null(不保存在 sqlite), 如何从 url 和 store(insert) 获取图像到 sqlite?

这是我的代码主要活动

public class MainActivity extends Activity {

    Button Btngetdata;

    // URL to get JSON Array
    private static String url = "http://10.0.2.2:81/bantulfolder/alldata.php";

    private String IMAGEURL = "http://10.0.2.2:81/bantulfolder/";

    private byte[] logoImage;

    // JSON Node Names
    private static final String TAG_DATA = "data";
    public static final String TAG_IDT = "idt";
    public static final String TAG_IDL = "idl";
    public static final String TAG_NAMA = "nama";
    public static final String TAG_ALAMAT = "alamat";
    public static final String TAG_IMAGE = "image";

    JSONArray user = null;

    private DatabaseHandler databaseHelper;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        databaseHelper = new DatabaseHandler(MainActivity.this);

        Btngetdata = (Button) findViewById(R.id.getdata);
        Btngetdata.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                new JSONParse().execute();
            }
        });
    }

    private class JSONParse extends AsyncTask<String, String, JSONObject> {
        final String TAG = "AsyncTaskParseJson.java";
        private ProgressDialog pDialog;

        @Override
        protected void onPreExecute() {
            super.onPreExecute();

            pDialog = new ProgressDialog(MainActivity.this);
            pDialog.setMessage("Getting Data ...");
            pDialog.setIndeterminate(false);
            pDialog.setCancelable(true);
            pDialog.show();
        }

        @Override
        protected JSONObject doInBackground(String... args) {
            JSONParser jParser = new JSONParser();
            // Getting JSON from URL
            JSONObject json = jParser.getJSONFromUrl(url);
            return json;
        }

        @Override
        protected void onPostExecute(JSONObject json) {
            pDialog.dismiss();
            try {
                // Getting JSON Array
                user = json.getJSONArray(TAG_DATA);
                // loop through all users
                for (int i = 0; i < user.length(); i++) {

                    JSONObject c = user.getJSONObject(i);
                    // Storing JSON item in a Variable
                    String idt = c.getString(TAG_IDT);
                    String idl = c.getString(TAG_IDL);
                    String nama = c.getString(TAG_NAMA);
                    String alamat = c.getString(TAG_ALAMAT);
                    String image = c.getString(TAG_IMAGE);

                    // code for get image url and make byte
                    logoImage = getLogoImage(IMAGEURL+image);

                    databaseHelper.saveCategoryRecord(idt, idl, nama, alamat, image, logoImage);

                    // Set JSON Data in TextView
                //  uid.setText(idt);
                    //name1.setText(name);
                    // email1.setText(email);
                    // show the values in our logcat
                    Log.e(TAG, "nama >>>> " + idt + "  alamat>>>>> " + nama);

                }
            } catch (JSONException e) {
                e.printStackTrace();
            }
        }
    }
    // try get url and make byte
    private byte[] getLogoImage(String geturl) {
        try {
            URL imageUrl = new URL(geturl);
            URLConnection ucon = imageUrl.openConnection();

            InputStream is = ucon.getInputStream();
            BufferedInputStream bis = new BufferedInputStream(is);

            ByteArrayBuffer baf = new ByteArrayBuffer(500);
            int current = 0;

            while ((current = bis.read()) != -1) {
                baf.append((byte) current);
            }

            return baf.toByteArray();
        } catch (Exception e) {
            Log.d("ImageManager", "Error: " + e.toString());
        }
        return null;
    }

}

这是我的数据库处理程序

public class DatabaseHandler {
    private static final int DATABASE_VERSION = 1;
    private static final String DATABASE_NAME = "bantul";
    private static final String TABLE_NAME = "tb_alldata";
    public static final String TAG_IDT = "idt";
    public static final String TAG_IDL = "idl";
    public static final String TAG_NAMA = "nama";
    public static final String TAG_ALAMAT = "alamat";
    public static final String TAG_IMAGE = "image";
    public static final String TAG_FILE_IMAGE = "file_image";

    Category openHelper;
    private SQLiteDatabase database;

    public DatabaseHandler(Context context){
        openHelper = new Category(context);
        database = openHelper.getWritableDatabase();
    }
    public void saveCategoryRecord(String idt, String idl, String nama, String alamat, String image, byte[] logoImage) {
        ContentValues contentValues = new ContentValues();
        contentValues.put(TAG_IDT, idt);
        contentValues.put(TAG_IDL, idl);
        contentValues.put(TAG_NAMA, nama);
        contentValues.put(TAG_ALAMAT, alamat);
        contentValues.put(TAG_IMAGE, image);
        contentValues.put(TAG_FILE_IMAGE, logoImage);

        database.insert(TABLE_NAME, null, contentValues);
        }
    public Cursor getTimeRecordList() {
        return database.rawQuery("select * from " + TABLE_NAME, null);
        }

    private class Category extends SQLiteOpenHelper {

        public Category(Context context) {
            // TODO Auto-generated constructor stub
            super(context, DATABASE_NAME, null, DATABASE_VERSION);
        }

        @Override
        public void onCreate(SQLiteDatabase db) {
            // TODO Auto-generated method stub
            db.execSQL("CREATE TABLE " + TABLE_NAME + "( "
                    + TAG_IDT + " INTEGER PRIMARY KEY, "
                    + TAG_IDL + " INTEGER, "+ TAG_NAMA + " TEXT, "+ TAG_ALAMAT + " TEXT, "+ TAG_IMAGE + " TEXT, "
                    + TAG_FILE_IMAGE + " BLOB, )" );
        }

        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
            // TODO Auto-generated method stub
            db.execSQL("DROP TABLE IF EXISTS"+ TABLE_NAME);
            onCreate(db);
        }

    }

【问题讨论】:

  • 为什么create table中没有TAG_IMAGE?
  • @issanthink 对不起,我打错了:(,我有编辑

标签: android json sqlite


【解决方案1】:

这并不完全是您问题的答案:虽然可以这样做,但这可能是个坏主意。

SQLite 效率取决于“页面”的概念。您保留对单个页面的引用越多,您的数据库的性能就越好。

当您开始使用 BLOB 时,有可能不仅单行不完全位于单个页面上,而且单个 BLOB 也可能不在单个页面上。这将大大减慢访问时间。

您可以设置页面大小,但这会占用大量内存。

如果您必须将图像保存在数据库中,我建议您将它们保存在单独的数据库中。在主数据库中设置页面大小默认值,并在另一个中设置适合您的 BLOB 大小。将 BLOB 的 PK 存储在主数据库中。

更好的是,只需将图像以随机名称保存在文件系统上,然后将名称存储在主数据库中。 ContentProviders 甚至支持 openFile 方法,让这变得非常简单。

您的代码实际上看起来是正确的。也许就像 TAG_FILE_GAMAR != TAG_FILE_IMAGE 这样简单?

【讨论】:

    【解决方案2】:

    正如@G 所建议的那样。 Blake Meike 而不是 BLOB,使用字符串来存储您的图像。

    这里你可以如何编码你的字节:

    String encodedImage = Base64.encodeToString(byteArrayImage, Base64.DEFAULT);

    【讨论】:

      猜你喜欢
      • 2019-03-10
      • 1970-01-01
      • 2021-10-14
      • 1970-01-01
      • 1970-01-01
      • 2014-06-20
      • 1970-01-01
      • 1970-01-01
      • 2017-12-13
      相关资源
      最近更新 更多