View Full Version : مشکل در ذخیره و فراخوانی عکس در sqlite
raha.scientific
پنج شنبه 02 دی 1395, 03:00 صبح
سلام
(من این مورد رو در سایت جستجو کردم و به نتیجه نرسیدم)
من در SQLite یک جدول ساختم و می خوام اطلاعات دو ستون (کشور و عکس پرچم) اون رو فراخوانی کنم و در فرگمنتم نمایش بدم
ستون کشور رو می تونم نمایش بدم .
ولی درمورد عکس پرچم :
اولا این ستونم در دیتابیس خالیه و نمیدونم باید چطوری مقدار بدم؟
دوما برفرض پرکردن این ستون توی دیتابیس نمیدونم چطوری باید فراخوانی کنم و در فرگمنتم نمایش بدم؟
عکس کدهای کلاس فرگمنت و کلاس آداپتر و کلاس (getter(),stter()1) رو گذاشتم راهنمایی کنید ممنون میشم
این کلاس فرگمنت:
143848
کلاس آداپتر و فراخوانی متد getCountry_Name() و ست کردن آن در یک تکست ویو برای نمایش در فرگمنت:
143849
کلاس Structure:
143850
hesam67_b
پنج شنبه 02 دی 1395, 10:12 صبح
با سلام.
شما میتونی اسم فایل رو در دیتابیس ذخیره کنی و فایل مربوطه رو در فولدر assets قرار بدی.
بعداز اون میتونی در آداپتر یک imagview تعریف و عکس پرچم رو از دیتابیس گرفته و نمایش بدی.
//loadDatabase
Structure country = new Structure();
country.setname = ...;
country.setflag = ...;
//adapter
holder.txtName.settext(name);
holder.imgFlag.setImageBitmap(image);
ghasem110deh
پنج شنبه 02 دی 1395, 13:12 عصر
سلام
(من این مورد رو در سایت جستجو کردم و به نتیجه نرسیدم)
من در SQLite یک جدول ساختم و می خوام اطلاعات دو ستون (کشور و عکس پرچم) اون رو فراخوانی کنم و در فرگمنتم نمایش بدم
ستون کشور رو می تونم نمایش بدم .
ولی درمورد عکس پرچم :
اولا این ستونم در دیتابیس خالیه و نمیدونم باید چطوری مقدار بدم؟
دوما برفرض پرکردن این ستون توی دیتابیس نمیدونم چطوری باید فراخوانی کنم و در فرگمنتم نمایش بدم؟
عکس کدهای کلاس فرگمنت و کلاس آداپتر و کلاس (getter(),stter()1) رو گذاشتم راهنمایی کنید ممنون میش
سلام :-)
شاید این لینک کمک تون کنه :
http://stackoverflow.com/questions/11790104/how-to-storebitmap-image-and-retrieve-image-from-sqlite-database-in-android
raha.scientific
جمعه 03 دی 1395, 15:40 عصر
خیلی ممنون
من بر اساس راهنمایی شما فایل عکسم رو (iran.png) در assets کپی کردم و همین اسم رو بدون پسوند در splite در ستون Flag نوشتم(برای کشور ایران)
در کلاس آداپترم یک imageview و یک Bitmap تعریف کردم:
ImageView img_flags;
Bitmap bmp;
holder.img_flags.setImageBitmap(bmp);
و در کلاس فرگمنت در متد loadDatabase:
Structure structure = new Structure();
structure.setFlag(cursor.getString(4));//چون ستون پرچم ستون چهارم دیتابیس هست
arrayList.add(structure);
ولی بازم عکس ها رو نشون نمیده موقع اجرا!
به نظرتون برای گرفتن عکس نباید مثل گرفتن متن از لیست استفاده کنم در این صورت به چه صورت؟
برای گرفتن عکس در کلاس آداپتر یک لیست تعریف کردم:
List<Structure> items = Collections.emptyList();
holder.txt_countryname.setText(items.get(position) .getCountry_Name());
چی کار بکنم نشون بده عکس ها رو ممنون...
hesam67_b
شنبه 04 دی 1395, 08:13 صبح
مشکل از اونجاست که شما باید فایل رو از assets بگیری که این نیاز به دستورالعمل خاصی داره.
تابع زیر این کار رو برات انجام میده.
public static Bitmap getBitmapFromAsset(Context paramContext, String strName)
{
AssetManager assetManager = paramContext.getAssets();
InputStream istr = null;
try {
istr = assetManager.open(strName);
}
catch (IOException e) {}
Bitmap bitmap = BitmapFactory.decodeStream(istr);
return bitmap;
}
اون bitmap که تعریف کردی اضافه هست.
در آداپتر کافیه اسم فایل (+ فرمت) رو به این تابع بدی که خروجیش bitmap هست. بعد خروجی رو به imageview بدی.
raha.scientific
شنبه 04 دی 1395, 15:32 عصر
مشکل از اونجاست که شما باید فایل رو از assets بگیری که این نیاز به دستورالعمل خاصی داره.
تابع زیر این کار رو برات انجام میده.
public static Bitmap getBitmapFromAsset(Context paramContext, String strName)
{
AssetManager assetManager = paramContext.getAssets();
InputStream istr = null;
try {
istr = assetManager.open(strName);
}
catch (IOException e) {}
Bitmap bitmap = BitmapFactory.decodeStream(istr);
return bitmap;
}
اون bitmap که تعریف کردی اضافه هست.
در آداپتر کافیه اسم فایل (+ فرمت) رو به این تابع بدی که خروجیش bitmap هست. بعد خروجی رو به imageview بدی.
خیلی ممنون واقعا الان دیگه عکس ها نمایش داده میشن ...
فقط میمونه یک سوال دیگه اینم اگر لطف کنید راهنمایی کنید ممنون میشم
من چون عکس رو در دیتابیس هم گذاشتم و می خوام برای هر آیتم، پرچم مربوط به همون آیتم نمایش داده بشه می خوام از متد ()getFlag که (در کلاس Structure ) عکس ها
رو از دیتابیس برمی گردونه استفاده کنم:
بنابراین توی کلاس آداپترم در متد onBindViewHolder این کدها رو نوشتم
List<Structure> items = Collections.emptyList();
Database database=new Database(context);
holder.img_flags.setImageBitmap(database.getBitmap FromAsset(context,items.get(position).getFlag()));
__________________________________________________ ____________________________________
و توی کلاس فرگمنتم درمتد LoadDatabase():
متد setFlag() رو فراخوانی کردم
Cursor cursor=database.QueryData("SELECT * FROM Country WHERE Ghareh='آفریقا'");
if (cursor!=null && cursor.moveToFirst())
{
do {
Structure structure = new Structure();
structure.setCountry_Name(cursor.getString(1));
structure.setFlag(cursor.getString(4));
arrayList.add(structure);
}
while (cursor.moveToNext());
}
ولی فورس کلوز میده
raha.scientific
شنبه 04 دی 1395, 18:05 عصر
در واقع اگر فقط از assets فراخوانی کنم همون عکس رو برای تمام کشور ها نشون میده و عکس رو از دیتابیس نمیگیره
یعنی من اگر این متد رو در فرگمنتم کامنت کنم بازم عکس ها رو نشون میده
//structure.setFlag(cursor.getString(4));
getFlag() استفاده شده ولی جایی از متدsetFlag() چون از متد
استفاده نشده تا از دیتابیس فیلد رو برگردونه
(getter , setter متدهای کلاس )
hesam67_b
شنبه 04 دی 1395, 18:39 عصر
من منظور شما رو متوجه نشدم. نیازی به ذخیره سازی عکس در دیتابیس نیست و پرچم ها رو در فولدر assets قرار بدید و فقط نام رو در دیتابیس ذخیره کنید و با اون تابعی که گفتم، عکس ها رو ست کنید.
raha.scientific
شنبه 04 دی 1395, 20:52 عصر
من منظور شما رو متوجه نشدم. نیازی به ذخیره سازی عکس در دیتابیس نیست و پرچم ها رو در فولدر assets قرار بدید و فقط نام رو در دیتابیس ذخیره کنید و با اون تابعی که گفتم، عکس ها رو ست کنید.
بله منم همین کار رو انجام دادم
یک عکس ضمیمه کردم دقیقا مراحلی که شما گفتید رو انجام دادم
143877
با این کدها توی همه ایمیج ویو ها یک پرچم رو نشون میده
( از کاردویو استفاده کردم که یک imageview و یک textview داره (پرچم و نام کشور) )
hesam67_b
یک شنبه 05 دی 1395, 18:25 عصر
ظاهرا برخی از کشورها پرچم نداره. شما باید یک عکس پیشفرض داشته باشی و در آداپتر چک کنی اگر کشور موردنظر پرچم داشت که پرچم رو ست میکنی وگرنه عکس پیشفرض رو ست کن.
if else قرار بده.
raha.scientific
دوشنبه 06 دی 1395, 15:52 عصر
سلام خیلی ممنون از توضیحتون
کدها رو به این صورت تغییر دادم:
public void onBindViewHolder(ViewHolder holder, int position) {
Database database=new Database(context);
//from database
holder.txt_countryname.setText(items.get(position) .getCountry_Name());
int resID = context.getResources().getIdentifier(items.get(pos ition).getFlag(), "mipmap", context.getPackageName());
if((items.get(position).getFlag().equals("0"))
{
try {
holder.img_flags.setImageBitmap(database.getBitmap FromAssets("iran.png"));
} catch (IOException e) {
e.printStackTrace();
}
}
else {
holder.img_flags.setImageResource(resID);
}
این بار عکس ها رو در mipmap قرار دادم
به ازای پرچم هایی که صفر هستند یک عکس پیش فرض ست کردم(فعلا پرچم ایران رو) ؛{ البته متدش رو هم کمی تغییر دادم که context نداشته باشه}
و پرچم هایی که خالی نیستند رو هم با متد getFlag() پر می کنم
ولی وقتی دیباگ می کنم position یکی یکی میره بالا(0,1,2,3,4,...)
ولی resID همیشه صفره
مشکل از اینه؟
hesam67_b
سه شنبه 07 دی 1395, 07:57 صبح
شما وقتی میخوای یک فایل رو از طریق context.getResources().getIdentifier دریافت کنی، باید فایل رو بدون پسوند بدی.
int resID = context.getResources().getIdentifier(items.get(pos ition).getFlag().replace(".png", ""), "mipmap", context.getPackageName());
raha.scientific
شنبه 11 دی 1395, 11:20 صبح
شما وقتی میخوای یک فایل رو از طریق context.getResources().getIdentifier دریافت کنی، باید فایل رو بدون پسوند بدی.
int resID = context.getResources().getIdentifier(items.get(pos ition).getFlag().replace(".png", ""), "mipmap", context.getPackageName());
این جوری هم امتحان کردم نشد،
در آخر هم اسم ها رو بدون پسوند وارد کردم (پسوند ها رو حذف کردم از فیلد Flag) و کدهای زیر رو نوشتم که بازم نشد:
int resID = context.getResources().getIdentifier(items.get(pos ition).getFlag(), "mipmap", context.getPackageName());
if((items.get(position).getFlag().equals("0"))
{
try {
holder.img_flags.setImageBitmap(database.getBitmap FromAssets("iran.png"));
} catch (IOException e) {
e.printStackTrace();
}
}
else {
holder.img_flags.setImageResource(resID);درهر حال ممنون از راهنماییتون.
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.