【问题标题】:Insert images into sql server and retrieve it将图像插入 sql server 并检索它
【发布时间】:2020-10-09 00:44:12
【问题描述】:

我想在我的 SQL 服务器中添加一些图像。我的问题是来自插入还是获取图像代码?

现在我检索图像的图像视图是空白的。

这是我插入图片的代码:

else {
    DatabaseHelper mDatabaseHelper = new DatabaseHelper(MainActivity.this);
    Cursor cursor2 = mDatabaseHelper.GetPath();
    while (cursor2.moveToNext()) {

        Bitmap bitmap = BitmapFactory.decodeFile(cursor2.getString(0));
        ByteArrayOutputStream blob = new ByteArrayOutputStream();
        bitmap.compress(Bitmap.CompressFormat.JPEG, 100 /* Ignored for PNGs */ , blob);
        byte[] bitmapdata = blob.toByteArray();
        String id = getIntent().getStringExtra("id");
        String query = "INSERT INTO StoresData VALUES('" + arabic + "','" + english + "','1','1','1','1','1','','" + lat + "','" + longi + "','" + mob + "','','','','','','','','0','','','','" + bitmapdata + "','" + user + "','" + passwords + "','0',NULL,'" + id + "')";
        Statement stmt = con.createStatement();
        stmt.executeUpdate(query);

        Cursor cursor = mDatabaseHelper.DeleteDataOfTableImagesAr();
        while (cursor.moveToNext()) {
            Toast.makeText(MainActivity.this, "Deleted images", Toast.LENGTH_LONG).show();
        }
    }
}

取回图片:

Blob blob = parkingList.get(position).getStoreicon();
if (blob != null) {
    byte[] byteArray = new byte[0];
    try {
        int length = (int) blob.length();
        byteArray = blob.getBytes(1, length);
    } catch (SQLException e) {
        e.printStackTrace();
    }
    Bitmap bm = BitmapFactory.decodeByteArray(byteArray, 0, byteArray.length);
    intent.putExtra("storeicon", bm);
} else {

}

是的,我正在将图像放入列表视图中。

检索和获取图像是在两个不同的应用程序中完成的,这就是我没有使用 SQLite 的原因。

【问题讨论】:

  • 我认为你可以通过使用调试器来解决这个问题。在这一行设置断点 "byteArray = blob.getBytes(1, length);"并确保您在代码中达到了这一点。当您到达那里时,请确保长度变量不为 0。如果您没有到达那一点,那么 blob 很可能为空,您需要调试代码的“插入”部分。
  • @JoshMaag 长度工作正常我在行后设置了一个 system.out.println 并且它正在打印并且工作正常。
  • @JoshMaag 有什么想法吗?非常感谢您的帮助!
  • 我想接下来我会尝试查看输入中的第一个和最后 5-10 个字节的 bitmapdata 和检索部分中的 byteArray,并确保它们匹配。如果他们不这样做,那么它可能是保存在数据库中的方式存在问题。如果它们确实匹配,那么它可能与位图工厂段或分配它有关。如果是这种情况,请检查“bm”是否为空。位图工厂的文档说返回是:“解码的位图,如果图像数据无法解码,则返回 null”(强调我的)。
  • @JoshMaag 我检查了它是否为空,你在哪里是对的。那么接下来我该怎么办?

标签: java android sql blob android-imageview


【解决方案1】:

我无法添加评论(声誉太低),但我认为

    int length = (int) blob.length();
    byteArray = blob.getBytes(1, length);

lenght 可以,正如您所说,.getBytes 从 1 开始到 lenght 并将其存储在数组中... 但是:

Bitmap bm = BitmapFactory.decodeByteArray(byteArray, 0, byteArray.length)

不应该

Bitmap bm = BitmapFactory.decodeByteArray(byteArray, 0, byteArray.length - 1)

? 长度从 1 开始,数组从 0 开始。

【讨论】:

  • 1.非常感谢您的贡献和诚实! 2.我认为这不是问题,因为我刚刚尝试过它仍然无法正常工作。但我有一种强烈的感觉,插入图像的代码是问题所在,因为我尝试了在另一个应用程序中获取图片的完全相同的代码,它工作得非常好,但我是从桌面应用程序插入图像。所以也许是代码插入是问题吗?!
  • 好的,我可以在这里发表评论 :) 我正在查看插入:您使用 " 表示位图数据,但它不是字符串,可能有问题吗?
  • 你的意思是查询字符串中的“如果是的话那么这里的”不是用来表示它是一个字符串,它是用来停止字符串。我的意思是它是另一个的最后一个分号一开始是一个
  • 另一件事,我从 uri 插入图像,然后将其转换为位图,然后转换为 blob 或 byteArray
  • 对不起,如果我坚持...但在 SQL Server '" + bitmapdata + "' 这是一个字符串。关于uri,要检查之前的步骤(图像的下载和位图的转换),我会将func复制到另一个项目中,而不是在blob中转换它,而是在图像视图中显示它,以确保问题出在 blob 中,而不是其他地方...
猜你喜欢
  • 2014-01-06
  • 2010-10-01
  • 2019-05-08
  • 2019-03-13
  • 2019-02-22
  • 2014-03-03
  • 2017-12-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多