ورود

View Full Version : مشکلات کار با SQLiteOpenhelper



sobhan1990
شنبه 28 اردیبهشت 1392, 10:49 صبح
سلام



من توی برنامم برای کار با هر جدول یه کلاس دیتابیس درست کردم که هر کدوم از کلاسهام از کلاس SQLiteOpenhelper مشتق میشن.

موقع کار با دیتابیس وقتی برنامه برای اولین با روی ایمولاتور اجرا میشه؛ با اولین جدول که کار میکنم مشکلی نیست ولی وقتی میخوام با جدول دوم کار کنم پیام میده که این جدول وجود نداره!!! چند بار برنامه رو از روی ایمولاتور پاک کردم و تست کردم و اگر در ابتدا با جدول دومم کار کنم و وقتی میخوام با جدول اول کار کنم اینبار پیام میده که این جدول وجود نداره!! در واقع انگار کوئری ساخت جدول اجرا نمیشه!!




کسی تا حالا چنین مشکلی نداشته؟؟

Nevercom
شنبه 28 اردیبهشت 1392, 13:09 عصر
چرا برای هر جدول از یه کلاس مجزا استفاده کردین ؟

درکل شما یه کلاس نیاز دارید که از SQLiteOpenHelper مشتق بشه و فایل دیتابیس و تمام جداولش رو ایجاد کنه
در نهایت کلاس های دیگه فقط فایل دیتابیس رو باز می کنن، کوئری ها رو ایجاد می کنن و درنهایت فایل دیتابیس رو می بندن

بهتره کدها و ساختار کلاس ها رو قرار بدید تا بهتر بشه بررسی کرد

sobhan1990
شنبه 28 اردیبهشت 1392, 20:22 عصر
سلام
2 تا کلاس استفاده کردم که کار کردن با دیتابیس راحت تر باشه
یکی از کلاسام اینه:

public class database1 extends SQLiteOpenHelper {
public static String TableName = "table1";
public static String DatabaseName = "mydb.db";
public static int DatabaseVersion = 1;

public static String ID = "_id";
public static String Name = "name";

public static String CreateTable = "create table " + TableName + " (" + ID + " integer primary key autoincrement, " + Name +
" text);";

public databaseFoods(Context context) {
super(context, DatabaseName, null, DatabaseVersion);
}

@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(CreateTable);
}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
Log.w(databaseFoods.class.getName(), "upgrading from version: " + oldVersion + "to versio: " + newVersion +
", which will destroy all old data");
db.execSQL("DROP TABLE IF EXIST " + TableName);
onCreate(db);
}

و کلاس دیگه ام:


public class database2 extends SQLiteOpenHelper {
public static String ID = "_id";
public static String Name = "name";
public static String UserName = "username";
public static String Password = "password";

public static String TableName = "table2";
public static String DatabaseName = "mydb.db";
public static int DatabaseVersion = 1;

public static String CreateTable = "create table " + TableName + " (" + UserName + " text primary key not null, " + Password +
" text not null, " + Name + " text);";

public databaseUsers(Context context) {
super(context, DatabaseName, null, DatabaseVersion);
}

@Override
public void onCreate(SQLiteDatabase db) {;
db.execSQL(CreateTabl);


@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
Log.w(databaseUsers.class.getName(), "upgrading from version: " + oldVersion + " to versio: " + newVersion +
", which will destroy all old data");
db.execSQL("DROP TABLE IF EXIST " + TableName);
onCreate(db);
}
}

Modernidea
یک شنبه 29 اردیبهشت 1392, 00:27 صبح
سلام

با اجازه دوست عزیز Nevercom

لازم نیست برای هر جدول یک کلاس مشتق شده از SQLite استفاده کنید.
ممکنه الان کار راحت تر باشه، چون تعداد خطوط کدی که نوشتید کم است، اما اگر این دو جدول تبدیل بشه به 10 یا 20 جدول، راحت که نخواهد بود هیچ، سخت تر و پیچیده تر هم میشود. کلا این روش مشکلات زیادی خواهد داشت و چون هر دو کلاس به یک دیتابیس اشاره دارد، کلا روش درستی نبوده و در صورت زیاد شدن جداول سربار بسیاری خواهد داشت.

شما میتونید یک کلاس مشتق شده از SQLite داشته باشید که عملیات لازم برای دیتابیس را انجام دهد.

برای هر جدول یک کلاس جداگانه بسازید. این کلاس لازم نیست که از SQLite مشتق شود. این کلاس میتواند شامل نام جدول، نام فیلد های جدول و توابع getter و setter مربوط به فیلدهای جدول باشد.

حال در کلاسی که از SQLite مشتق شده است میتوانید دستورات مربوط به ایجاد جداول را پیاده سازی کنید و نام جدول و فیلد های هر جدول را از کلاس مربوط به خود آن جدول که در خط بالا توضیح داده شد، بگیرید.

با این کار شما فقط یک کلاس مرجع دارید که از SQLite مشتق شده است و برای ایجاد، حذف و تغییر در دیتابیس از همین کلاس استفاده میکنید.

این آموزش هم منبع خوبی در این مورد میباشد: http://www.androidhive.info/2011/11/android-sqlite-database-tutorial/
موفق باشید.

sobhan1990
یک شنبه 29 اردیبهشت 1392, 09:31 صبح
این پست حذف شد.

Modernidea
یک شنبه 29 اردیبهشت 1392, 10:16 صبح
سلام

عذر میخوام ولی این سوال هیچ ارتباطی با موضوع تاپیک یعنی SQLite نداره و معذورم از جواب دادن.
بهتره در یک تاپیک جدید مطرح کنید و این پست را حذف کنید.

موفق باشید.