View Full Version : مهم : جدول در دیتابیس که توی دیوایس که برنامه رو نصب...
armsoftpc
دوشنبه 20 مرداد 1393, 00:04 صبح
با سلام
جدول (مثلا books) در دیتابیس که توی دیوایس (موبایل اندرویدی (هوشمند)) که برنامه رو نصب می کنم، پیام میده که وجود نداره no such table books :اشتباه::ناراحت:,... اما توی شبیه ساز(simlatour) به خوبی کار می کنه و راحت جدول رو پیدا میکنه.
این رو هم بگم، که من جدول رو با کد نمی سازم و جدول از پیش ساخته با استفاده از DDMS انتقالش میدم.:متفکر:
ممنون از اینکه به سوال پاسخ بدهید.
موفق باشید.
armsoftpc
دوشنبه 20 مرداد 1393, 10:32 صبح
منتظریم...
poorman
دوشنبه 20 مرداد 1393, 12:54 عصر
سلام
یعنی چی از جدول پیش ساخته با DDMS انتقالش میدید ؟؟؟
احتمالا مشکلتون اینه که کلا دیتابیستون توی گوشی کپی نمیشه
شما از لایبری SQLite Asset Helper برای انتقال دیتابیس آماده به گوشی استفاده کنید به هیچ مشکلی بر نمیخورید
armsoftpc
دوشنبه 20 مرداد 1393, 15:03 عصر
سلام
یعنی چی از جدول پیش ساخته با DDMS انتقالش میدید ؟؟؟
احتمالا مشکلتون اینه که کلا دیتابیستون توی گوشی کپی نمیشه
من برنامه رو با try/catch درست کردم، جوری که خطا نمیده دیتابیس وجود نداره یا کانکت نمیشه، به دیتابیس کانکت میشه، ولی جدول وجود نداره.
شما از لایبری SQLite Asset Helper برای انتقال دیتابیس آماده به گوشی استفاده کنید به هیچ مشکلی بر نمیخورید
اون رو هم انشاالله بعدا تست می کنم، اما این روش اولیه که آموزش دادید، چه اشکالی داره که وقتی فایل ستاپ apk میسازیم و به گوشی انتقال و نصب می کنیم.
میگه no such table : books (code:1)....
mydb = openOrCreateDatabase("/data/data/com.armpc.pcworld/databases/PERSONS", Context.MODE_WORLD_READABLE,null);
try
{
Cursor allrows = mydb.rawQuery("Select * From books ", null);
Product[] items = new Product[allrows.getCount()];
int i = 0;
if(allrows.moveToFirst())
{
do
{
items[i] = new Product(allrows.getString(0), allrows.getString(1), allrows.getString(2));
i++;
}
while(allrows.moveToNext());
}
//allrows.close();
mydb.close();
ArrayAdapter<Product> adapter = new ArrayAdapter<Product>(this, android.R.layout.simple_list_item_1, android.R.id.text1, items);
ListView lst = (ListView) findViewById(R.id.listView1);
lst.setAdapter(adapter);
}
catch(SQLException msg)
{
Log.e("در اتصال مشکلی پیش آمده است.", msg.getMessage());
//Toast.makeText(this, " : خطا"+ msg.getMessage() , 1);
new AlertDialog.Builder(this) .setMessage(msg.getMessage()).show();
}
armsoftpc
دوشنبه 20 مرداد 1393, 15:07 عصر
یعنی چی از جدول پیش ساخته با DDMS انتقالش میدید ؟؟؟
یعنی اینکه با Sqlite expert دیتابیس جداول و فیلدها رو ایجاد میکنم و بعد FileManger DDMS انتقالش میدم توی پوشه data/data/my_prog/database
poorman
دوشنبه 20 مرداد 1393, 15:37 عصر
شما اگر میخواین دیتابیس رو از قبل ایجاد کنید بهترین و بی نقص ترین راه لایبری SQLite Asset Helper هست
این کاری که شما میکنید باعث به وجود اومدن چنین مشکلاتی میشه
من نمیتونم تو زمینه انتقال دیتابیس از طریق DDMS راهنمایی کنم متاسفانه
توی اون تاپیک دو راه آموزش دادم که از هرکدومشون برید به چنین مشکلاتی برخورد نخواهید کرد
armsoftpc
دوشنبه 20 مرداد 1393, 15:52 عصر
ممنون از شما.اما:
شما اگر میخواین دیتابیس رو از قبل ایجاد کنید بهترین و بی نقص ترین راه لایبری SQLite Asset Helper هست
دیتابیس هایی که به این وسیله ساخته میشوند و در پوشه asset کپی میشند، نمی تونند بیشتر از 1 مگ باشند، توی این سایت stackoverflow.com یکی همین سوال رو داشت و اینگونه جواب داده بودند.:متفکر:
توی اون تاپیک دو راه آموزش دادم که از هرکدومشون برید به چنین مشکلاتی برخورد نخواهید کرد
من اتفاقا اگه به کد دقت کنید، از راه اول شما استفاده کردم...:لبخند:
poorman
دوشنبه 20 مرداد 1393, 15:58 عصر
کی همچین حرفی زده که نمیشه بیشتر از 1 مگابایت باشه ؟؟؟
من دیتابیس برنامم 40 مگابایت هست و دارم از همین لایبری استفاده میکنم !!!
شما از روش اول برای خوندن اطلاعات دارید استفاده میکنید، برای ساختش که استفاده نمیکنید
اگر دیتابیس رو هم با کد بسازید این مشکل پیش نمیاد
armsoftpc
دوشنبه 20 مرداد 1393, 16:16 عصر
خیلی ممنون.
من دیتابیس برنامم 40 مگابایت هست و دارم از همین لایبری استفاده میکنم !!!
اونوقت سرعت برنامه کاهش پیدا نمیکنه، چه در اجرا، چه در هنگام کار
اگه فایل رو zip نکنیم، باعث میشه که سرعتش بیشتر بشه، چون به برنامه نویسی برای نسخه کمتر از 2.3.3 نداریم.(Api ماقبل 10)
دوست عزیز خیلی لطف کردید، جواب سوال رو دادید، فقط یه چیز دیگه این چند روز دارم هی توی سایتا دنبالش میگردم، اونم این که وقتی یه لیست ویو (به کد زیر) میسازیم:
public void db_conn()
{
SQLiteDatabase mydb = openOrCreateDatabase("/data/data/com.armpc.pcworld/databases/PERSONS", Context.MODE_WORLD_READABLE,null);
try
{
Cursor allrows = mydb.rawQuery("Select * From books ", null);
Product[] items = new Product[allrows.getCount()];
new AlertDialog.Builder(this) .setMessage("hello1").show();
int i = 0;
if(allrows.moveToFirst())
{
do
{
items[i] = new Product(allrows.getString(0), allrows.getString(1), allrows.getString(2));
i++;
}
while(allrows.moveToNext());
}
//allrows.close();
mydb.close();
new AlertDialog.Builder(this) .setMessage("hello2").show();
ArrayAdapter<Product> adapter = new ArrayAdapter<Product>(this, android.R.layout.simple_list_item_1, android.R.id.text1, items);
ListView lst = (ListView) findViewById(R.id.listView1);
lst.setAdapter(adapter);
new AlertDialog.Builder(this) .setMessage("hello3").show();
lst.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> av, View v, int pos, long id) {
Log.e("اطلاعات لیست", String.format("av : %s \n v: %s %s %s %s", av, v, pos, id, v.getTag()) );
}
});
}
catch(SQLException msg)
{
Log.e("در اتصال مشکلی پیش آمده است.", msg.getMessage());
//Toast.makeText(this, " : خطا"+ msg.getMessage() , 1);
new AlertDialog.Builder(this) .setMessage(msg.getMessage()).show();
}
}
public class Product
{
private String id;
private String name;
private String price;
public Product(){
super();
}
public Product(String id, String name, String price) {
super();
this.id = id;
this.name = name;
this.price = price;
}
@Override
public String toString() {
return this.id + ". " + this.name + " [$" + this.price + "]";
}
}
همه چی توی قالبی که ما میخوایم نمایش پیدا میکنه، ولی مثلا میخوام وقتی کاربر روش کلیک کرد، بره توی اکتیوتی دیگر که بتونه ویرایشش کنه، مشکل اینکه نمیتونم book_id (نه position) اون سطری که کلیک کرده رو بدست بیارم.بعدش فرم ادیت رو نمایش بدم.
با تشکر
armsoftpc
دوشنبه 20 مرداد 1393, 16:19 عصر
یه سوال دیگه چطوری مشه مثل نرم افزارهای دیکشنری مانند میلاد دیکشنری دیتابیس خارجی داشت، یعنی توی asset نباشه، که حجم فایل ستاپ بالا بره، مثلا بعضی سایتها نوشتن وقتی این نرم افزار رو نصب کردید، فایل دیتابیس(یا دیتاش) رو در پوشه روت/... کپی کنید.
این جوری فکر کنم میشه، دیتابیس هایی تا 500 مگ داشت.
omid.n1990
دوشنبه 20 مرداد 1393, 16:25 عصر
سلام، دوست عزیز شما وقتی از طریق DDMS بانک ات رو ایمپورت میکنی، در واقع داری دیتبایس خودت رو توی اون شبیه ساز قرار میده، مشخصا وقتی از شبیه ساز استفاده کنی دیتابیست رو میشناسه. ولی وقتی تو گوشی استفاده کنی دیتابیسی وجود نداره!!
وقتی هم کد
mydb = openOrCreateDatabase("/data/data/com.armpc.pcworld/databases/PERSONS", Context.MODE_WORLD_READABLE,null);
رو میزنی، باتوجه به openOrCreateDatabase، میبینه دیتابیس وجود نداره و میره دیتابیس رو ایجاد میکنه (یک دیتابیس خالی)، به خاطر همین تو گوشی به شما میگه جدول وجود نداره، چون دیتابیس هست.
اما راهکار: شما باید با نوشتن یک کلاس، در اولین اجرای برنامه ات، فایل ات رو از پوشه ی assest مثل یک فایل عادی کپی کنی تو گوشی.
موفق باشی
armsoftpc
دوشنبه 20 مرداد 1393, 16:32 عصر
اما راهکار: شما باید با نوشتن یک کلاس، در اولین اجرای برنامه ات، فایل ات رو از پوشه ی assest مثل یک فایل عادی کپی کنی تو گوشی.
ممنون. امکان داره کدش رو بنویسید.
شما اگر میخواین دیتابیس رو از قبل ایجاد کنید بهترین و بی نقص ترین راه لایبری SQLite Asset Helper هست
08-11 12:34:49.913: E/AndroidRuntime(837): FATAL EXCEPTION: main
08-11 12:34:49.913: E/AndroidRuntime(837): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.armpc.pcworld/com.armpc.pcworld.UserData}: com.readystatesoftware.sqliteasset.SQLiteAssetHelp er$SQLiteAssetException: Missing databases/pcworld.db file (or .zip, .gz archive) in assets, or target folder not writable
08-11 12:34:49.913: E/AndroidRuntime(837): at android.app.ActivityThread.performLaunchActivity(A ctivityThread.java:1956)
08-11 12:34:49.913: E/AndroidRuntime(837): at android.app.ActivityThread.handleLaunchActivity(Ac tivityThread.java:1981)
08-11 12:34:49.913: E/AndroidRuntime(837): at android.app.ActivityThread.access$600(ActivityThre ad.java:123)
08-11 12:34:49.913: E/AndroidRuntime(837): at android.app.ActivityThread$H.handleMessage(Activit yThread.java:1147)
08-11 12:34:49.913: E/AndroidRuntime(837): at android.os.Handler.dispatchMessage(Handler.java:99 )
08-11 12:34:49.913: E/AndroidRuntime(837): at android.os.Looper.loop(Looper.java:137)
08-11 12:34:49.913: E/AndroidRuntime(837): at android.app.ActivityThread.main(ActivityThread.jav a:4424)
08-11 12:34:49.913: E/AndroidRuntime(837): at java.lang.reflect.Method.invokeNative(Native Method)
08-11 12:34:49.913: E/AndroidRuntime(837): at java.lang.reflect.Method.invoke(Method.java:511)
08-11 12:34:49.913: E/AndroidRuntime(837): at com.android.internal.os.ZygoteInit$MethodAndArgsCa ller.run(ZygoteInit.java:784)
08-11 12:34:49.913: E/AndroidRuntime(837): at com.android.internal.os.ZygoteInit.main(ZygoteInit .java:551)
08-11 12:34:49.913: E/AndroidRuntime(837): at dalvik.system.NativeStart.main(Native Method)
08-11 12:34:49.913: E/AndroidRuntime(837): Caused by: com.readystatesoftware.sqliteasset.SQLiteAssetHelp er$SQLiteAssetException: Missing databases/pcworld.db file (or .zip, .gz archive) in assets, or target folder not writable
08-11 12:34:49.913: E/AndroidRuntime(837): at android.content.res.AssetManager.openAsset(Native Method)
08-11 12:34:49.913: E/AndroidRuntime(837): at android.content.res.AssetManager.open(AssetManager .java:315)
08-11 12:34:49.913: E/AndroidRuntime(837): at android.content.res.AssetManager.open(AssetManager .java:289)
08-11 12:34:49.913: E/AndroidRuntime(837): at com.readystatesoftware.sqliteasset.SQLiteAssetHelp er.copyDatabaseFromAssets(SQLiteAssetHelper.java:4 36)
08-11 12:34:49.913: E/AndroidRuntime(837): at com.readystatesoftware.sqliteasset.SQLiteAssetHelp er.createOrOpenDatabase(SQLiteAssetHelper.java:400 )
08-11 12:34:49.913: E/AndroidRuntime(837): at com.readystatesoftware.sqliteasset.SQLiteAssetHelp er.getWritableDatabase(SQLiteAssetHelper.java:176)
08-11 12:34:49.913: E/AndroidRuntime(837): at com.armpc.pcworld.UserData.db_asset_conn(UserData. java:52)
08-11 12:34:49.913: E/AndroidRuntime(837): at com.armpc.pcworld.UserData.onCreate(UserData.java: 31)
08-11 12:34:49.913: E/AndroidRuntime(837): at android.app.Activity.performCreate(Activity.java:4 465)
08-11 12:34:49.913: E/AndroidRuntime(837): at android.app.Instrumentation.callActivityOnCreate(I nstrumentation.java:1049)
08-11 12:34:49.913: E/AndroidRuntime(837): at android.app.ActivityThread.performLaunchActivity(A ctivityThread.java:1920)
08-11 12:34:49.913: E/AndroidRuntime(837): ... 11 more
omid.n1990
دوشنبه 20 مرداد 1393, 16:56 عصر
اون بخشی که شما میخواهید رو باید پیدا کنم، الان کمی درگیرم ولی اگر مشکلت حل نشد اولین فرصت براتون قرار میدم ،ولی بخوام بگم چیکار کنید یک همچین کاری بکنید تو stackoverflow هم بگردید راحت پیدا کنید.
روش کلی:
شما به جای نوشتن نام دیتابیس میتونید مسیر دیتابیس رو بدید
myPath:
myDataBase = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY);
اما مسیر دیتابیس کجاست. شما کاری که باید انجام بدید استفاده از فایل یا ایمپوت استریم هست. شما به سادگی با استفاده از InputStream میتونید فایلهایی که تو assest هستند رو بخونید و بنویسید (write). شما ابتدا فایلتون رو با InputStream از assese میخونید و انو تو بخش دیتای پکیج فعلی با نام دیتابیس دلخواه با متد write انجام میدید.
data/data/yourpackage/databases/databaseName
عملا همونکاری که دستی ایمپورت میکردید تو ddms، اینجا با کد انجام میدید! اون هم با یک متد write از imputstream
موفق باشید
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.