# Native Code > برنامه نویسی موبایل > Android Studio >  آموزش : کار با دیتابیس SQLite به زبان ساده بدون نیاز به کلاس DataBaseHelper

## poorman

*سلام
*

*این مطلب در سال ۱۳۹۲ نوشته شده، آموزش کامل‌تر و جامع‌تری رو داریم تهیه میکنیم که میتونید در آدرس‌های زیر مطالعه کنید.


بخش اول: آشنایی با دیتابیس - ساخت جدول و وارد کردن اطلاعات به جدول

بخش دوم: خواندن اطلاعات از جدول و استفاده از اونها

بخش سوم: آپدیت و حذف کردن اطلاعات درون جدول

بخش چهارم: پیاده سازی دیتابیس پیشرفته اندروید با استفاده از کلاس ها

بخش پنجم: پیاده سازی گام به گام نمونه پروژه دیتابیس پیشرفته

بخش ششم: آموزش استفاده از دیتابیس آماده اندروید

-----------------------------------------------------------------------------------------------

*توی این پست ابتدا ساخت دستی دیتابیس و سپس کار با دیتابیس رو یاد میگیرید

درصورتی که میخواین با دیتابیس آماده کار کنین این پست رو مشاهده کنین*
*
-----------------------------------------------------------------------------------------------------------------------

واقعیت اینه که من از همون اول نتونستم با پیچیدگی کلاس DataBaseHelper ارتباط خوبی برقرار کنم ، به همین خاطر خیلی ساده و ابتدایی میخوام کار با دیتابیس رو بدون پیچیدگی آموزش بدم 
باشد که خدا از ما راضی باشد  :خجالت: 

برای دیتابیس چند تا پارامتر داریم ، یکی شیء دیتابیس که اینطوری تعریف میشه 

SQLiteDatabase mydb;
بعد نام دیتابیسی که میخوایم ایجاد کنیم یا ازش استفاده کنیم 

private static String DBNAME = "PERSONS";    // THIS IS THE SQLITE DATABASE FILE NAME.

بعد نام جدول یا جدول های دیتابیس رو برای استفاده تعریف میکنید ، اگر با مفهوم جدول آشنا نیستید باید بگم بخشی از دیتابیس هست که شما می تونید اطلاعات مربوط به یک موضوع یا اصطلاحا موجودیت خاص رو ذخیره کنید

private static String TABLE = "MY_TABLE";       // THIS IS THE TABLE NAME

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

mydb = openOrCreateDatabase(DBNAME, Context.MODE_PRIVATE,null);

----------------------------------------------------------------------------------------

*ساخت جدول در دیتابیس* 

خب حالا دیتابیس ما برای استفاده آماده ست ، الان نیاز به یک جدول با مشخصات مورد نظرمون برای ثبت اطلاعات داریم ( دیتابیس میتونه دارای چندین جدول باشه ، و هر جدول میتونه به ازای هر مشخصه یک ستون داشته باشه که باید نوع اون رو تعریف کنیم )
مثلا اگر شما میخواین اطلاعات یک دانش آموز رو ذخیره کنین ، ممکنه به این ترتیب جدول رو بسازید
ستون شماره دانش آموزی ، ستون نام ، نام خانوادگی ، معدل 
هر جدول باید یک ستون داشته باشه که مقدار اون تکراری نباشه (primary key) ، اگر همچین مشخصه ای نداشتین میتونین یک ستون به اسم ID بسازید و بذارید که خود sqlite اون رو مقدار بده 

mydb.execSQL("CREATE TABLE IF  NOT EXISTS "+ TABLE +" (ID INTEGER PRIMARY KEY, NAME TEXT, PLACE TEXT);");

خب جدول ما درصورتی که وجود نداشته باشه ساخته میشه ( دقت کنید اول اسم ستون ، بعد نوع محتویات ستون مثلا AGE INTEGER )

اگر کارتون با دیتابیس تموم شد حتما اون رو با کد زیر ببندید

mydb.close();

-----------------------------------------------------------------------------------------------

*وارد کردن اطلاعات در جدول ( از طریق کد )*

حالا اگر خواستید اطلاعات رو وارد جدول کنید ، اگر دیتابیس بسته ست بعد از باز کردن اون از کد زیر استفاده میکنیم

mydb = openOrCreateDatabase(DBNAME, Context.MODE_PRIVATE,null);
            mydb.execSQL("INSERT INTO " + TABLE + "(NAME, PLACE) VALUES('یک دو سه','امتحان')");
mydb.close();

اینجا ما دو تا ستون NAME و PLACE رو مقدار دادیم ، و همونطور که دقت میکنید ID رو مقدار ندادیم تا خود Sqlite مقدار اون رو از یک هر دفعه اضافه کنه به صورت اتوماتیک ( اگر مقدار ستون primary key تکراری باشه خطا میگیرید )

*کار با دستورات UPDATE و DELETE رو توی این پست میتونید مشاهده کنید

-------------------------------------------------------------------------------------------------------------------

خواندن اطلاعات از دیتابیس
*
حالا میخوایم اطلاعات رو از جدول بخونیم 
برای این کار از یک شیء Cursor استفاده میکنیم که اطلاعات جدول رو داخل خودش نگه میداره 
ابتدا باید قسمت های مورد نیاز از جدول رو داخل Cursor بریزیم

mydb = openOrCreateDatabase(DBNAME, Context.MODE_PRIVATE,null);
            Cursor allrows  = mydb.rawQuery("SELECT * FROM "+  TABLE, null);

ما تو این کد با * تمام ستون های جدول رو به ترتیب داخل cursor ریختیم 
در صورت نیاز میتونید فقط چند ستون رو انتخاب کنید تا کارتون راحت تر باشه
و میتونید ردیف هایی رو انتخاب کنید که یک شرط خاص رو داشته باشند ( مثلا دانشجویان با معدل بالای 16 )
اینا رو اگر نمیدونید یا برید دنبالش بگردید ، یا بپرسید براتون مثال بزنم ، چون به SQL ربط داره نه اندروید

خب حالا اطلاعات بدست اومده توی Cursor رو میشه به این ترتیب از اول تا آخر استفاده کرد
مثلا ما این اطلاعات رو داخل آرایه میذاریم، یا میشه اطلاعات رو توی textView نمایش داد ( این دست خود شماست )

فقط حواستون باشه اگر از آرایه استفاده کردید قبلش آرایه رو بر اساس تعداد سطرهای cursor دوباره سازی کنید، مثل کد زیر

NAME = new String[allrows.getCount()];

و ریختن اطلاعات توی آرایه :


                              int i = 0;
                    if(allrows.moveToFirst()){
                        do{
                            ID[i] = allrows.getInt(0);
                            NAME[i] = allrows.getString(1);
                            PLACE[i] = allrows.getString(2);
                            i++;
                        }
                        while(allrows.moveToNext());
                    }
                        allrows.close();
                        mydb.close();

بعد از خوندن اطلاعات از cursor هم باید حتما اون رو مثل دیتابیس بندید 

*اطلاعاتی رو که داخل آرایه ریختین میتونید به آداپتر لیست ویو یا گرید ویو بفرستید و در اونجا نمایش بدین
*
خب تبریک میگم شما یاد گرفتید خیلی ساده اطلاعات رو در دیتابیس ذخیره کنید و از دیتابیس بخونید
اگر نیاز به توضیح بود در خدمتم 
دکمه تشکر هم که اون پایین هست دیگه  :لبخند گشاده!:

----------


## hamedjj

البته یه راه ساده هم برای کار با دیتابیس آماده هست که استفاده از لایبری sqlite asset helper است

https://github.com/jgilfelt/android-sqlite-asset-helper

----------


## poorman

حامد جان والا کلاس و لایبری که هست ، ولی فقط هست  :لبخند گشاده!: 
میگم من هنوز نتونستم ارتباط خوبی برقرار کنم ، چون برام راحت نیست 
بیشتر راحتم خودم چیزی که نیازم هست رو کد بنویسم ، بازم اگه این کلاس ها و لایبری ها یک آموزش استفاده خوب داشته باشه استقبال میکنیم ، نه اینکه لینک باشه  :چشمک:

----------


## hamedjj

خوب اینقدر آسونه که فکر میکنم نیاز به آموزش نداشته باشه (البته در صفحه برنامه آموزش انگلیسیش هست)
فایل jar را تو پوشه libs برنامه کپی میکنید
بعد همانند اکتیویتی mydatabase نام تیبل و ستون ها را معرفی میکنید
همین

راستی من شنیدم برای آپدیت برنامه باید برنامه ورژن قبل که دیتابیس قبلی توش هست را پاک کرد و برنامه جدیدتر رانصب کرد تا دیتابیس تغییر کنه اما تو این لایبری اصلا نیاز نیست (تو مثال هاش هم مثال آپدیت دیتابیس وجود داره)

----------


## abbasalim

سلام
الان روش ساده ای که شما گفتین زیاد فرقی نداره ها فقط دسترسی بهش مشکل تر میشه همین :اشتباه:

----------


## poorman

> سلام
> الان روش ساده ای که شما گفتین زیاد فرقی نداره ها فقط دسترسی بهش مشکل تر میشه همین


فرقش اینه که فهمش ساده تره 
واسه کسایی که با دیتابیس آشنایی ندارن خوبه 
حالا بعدش که آشنا شدن ، منم توصیه میکنم اصولی و مرتب از کلاس ها استفاده کنن :)

----------


## jafaripur

من نمی دونم شماها چرا خودتون رو به مشکل میندازین !
از کلاس SQLiteDatabase و Cursor استفاده کن و نیازی به این DBHelper ها نیست.

----------


## hamedjj

اهمیت استفاده از این لایبری اینه که لازم نیست برنامه قبلی را پاک کنیم که دیتابیس جدید تاثیر داشته باشه
خواسیتن sample های این برنامه را دانلود کنید

آیا این روش که همه میگن همین طوره یا برای ورژن جدید دیتابیس باید برنامه قبلی را پاک کنیم؟

----------


## poorman

*آموزش کار با دیتابیس آماده SQLite
*
برای ساخت یک دیتابیس خارجی و آماده نرم افزار* SQLite Database Browser* رو پیشنهاد میکنم 

نمونه کار با دیتابیس آماده و نمایش و آپدیت اطلاعات دیتابیس رو از* این پست* دریافت کنید

-----------------------------------------------------------------------------------------------

بالاخره من دیشب تونستم تمام مشکلات مربوط به دیتابیس آماده رو حل کنم و ارتباط خوبی برقرار کنم با لایبری sqlite asset helper 

( با تشکر از hamedjj به خاطر پافشاری روی استفاده از این لایبری )
ولی خب استفاده از این لایبری هم یکم برام گیج کننده بود که خدا رو شکر تونستم آخرش راه بندازمش
من یه توضیح میدم واسه کسایی که میخوان با دیتابیس آماده کار کنن و مثل من به مشکل خوردن

انصافا استفاده از sqlite asset helper راحته و بسیار کارا
یکی از مشکلاتی که من برخورد کردم توی استفاده از کلاس های دیگه، این بود که توی اندروید 10 به پایین دیتابیس رو ایجاد نمیکرد ولی این لایبری مشکل رو حل کرد

خب دوستانی که با اکلیپس کار میکنن این فایل jar رو دانلود کنن و توی پروژه مورد نظر در پوشه *libs* قرار بدن

*لینک فایل jar*

توی پوشه*assets* یک پوشه به اسم *databases* بسازید

بعد دیتابیس خودتون رو* zip* کنید ( فایل دیتابیس به تنهایی باید پسوند *.db* داشته باشه )

فایل زیپ شده رو با فرمت اسم* ( DataBaseName.db.zip )* توی پوشه* databases* بذارید.* ( دقت کنید باید هم پسوند db هم پسوند zip داشته باشه )
*
یعنی نمایش فایل زیپ توی ویندوز به صورت *DataBaseName.db*  و نمایش توی اکلیپس به شکل *DataBaseName.db.zip* باشه

بعدش این کلاس رو ایجاد کنین



public class MyDatabase extends SQLiteAssetHelper {

private static final String DATABASE_NAME = "DataBaseName.db";
private static final int DATABASE_VERSION = 1;

public MyDatabase (Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
setForcedUpgrade();
}
}

توی کلاسی که ایجاد کردین اسم دیتابیس خودتون رو با پسوند *db* وارد کنین

بعدش توی اکتیویتی توی متغیرهای عمومی یک نمونه از این کلاس تعریف کنید، به این صورت :
private MyDatabase MyDataBase;

و بعد توی متد onCreate این خط کد رو بنویسین :
MyDataBase = new MyDatabase(this);

حالا هر جایی که خواستین دیتابیس رو باز کنین، میتونین از دو تا حالت getWritableDatabase() و getReadableDatabase() که برای خوندن و نوشتن هست استفاده کنین
به صورت زیر مثلا :

mydb = MyDataBase.getReadableDatabase();

وقتی getReadableDatabase استفاده میکنید، فقط عملیات خواندن رو میتونید انجام بدید

پس برای نوشتن یا آپدیت و دیلت باید از getWritableDatabase استفاده کنید

به همین سادگی، فقط باید تمام این مراحل رو به ترتیب و همینطور که گفتم انجام بدید که به مشکل نخورید
( zip کردن دیتابیس برای اینه که توی اندروید 10 به پایین خطا نگیرید )

*آ**موزش کار با دیتابیس ( خواندن، نوشتن، آپدیت و دیلت ) توی همین تاپیک قرار داده شده

لطفا بعد از مطالعه درصورت وجود مشکل سوال بپرسید در خدمتم*

----------------------------------------------------------------------------------------------

*برای آپدیت کردن اطلاعات دیتابیس آماده به این پست مراجعه کنید
*
اگر مفید واقع شد، دکمه تشکر این پایینه  :لبخند گشاده!:

----------


## poorman

برای update و delete همون دستورات SQL استفاده میشه 
به این صورت آپدیت میکنیم :

mydb.execSQL("update tableName set fieldName = 'value' where _id = 2");

با این دستور توی جدول tableName، مقدار ستون یا فیلد fieldName رو در جایی که id_ برابر 2 باشه، به value تغییر میدیم 
اگه براش شرط نذارین مقدار fieldName تمام رکوردهاتون رو آپدیت میکنه
مثلا دستور زیر نمره همه دانشجوها رو 20 میکنه !!! 

mydb.execSQL("update student set mark=20);

دستور delete هم به همین شکل عمل میکنه ، اگه شرط بذارین براش فقط رکوردهایی که اون شرط رو دارن پاک میکنه ، اگه شرط نذارین کل رکوردهای جدول رو پاک میکنه

mydb.execSQL("delete tableName where _id > 40);

----------


## mohsen22

تشکر فراوان و ممنون که تجربیاتتون رو در اختیار بقیه گذاشتید

----------


## hamedjj

دمت گرم *poorman* جان که این موضوع را دنبال کردی و توضیحات کاملی برای هممون گذاشتی
من مزیت و راحتی این لایبری را تو همین تالار در چند تا تاپیک دیگه مطرح کردم اما این طور که مشخص بود کسی زیاد علاقه به استفاده از این لایبری را نداشت و از همان روش معمول استفاده میکردند.
واقعا دستت درد نکنه
..
میگم بیکار شدی یه پروژه آموزشی درباره این لایبری و آپدیت جدید بساز و در نمونه برنامه های کوچک اما مفید قرار بده که بقیه استفاده کنند.
یا اصلا همون sample های لایبری را با اضافه کردن چند تا کامنت فارسی در پروژه برای فهم بیشتر در تاپیک نمونه برنامه ها قرار بده
البته اگه حال داشتی و وقت داشتی
بازم دمت گرم

----------


## poorman

> دمت گرم *poorman* جان که این موضوع را دنبال کردی و توضیحات کاملی برای هممون گذاشتی
> من مزیت و راحتی این لایبری را تو همین تالار در چند تا تاپیک دیگه مطرح کردم اما این طور که مشخص بود کسی زیاد علاقه به استفاده از این لایبری را نداشت و از همان روش معمول استفاده میکردند.
> واقعا دستت درد نکنه
> ..
> میگم بیکار شدی یه پروژه آموزشی درباره این لایبری و آپدیت جدید بساز و در نمونه برنامه های کوچک اما مفید قرار بده که بقیه استفاده کنند.
> یا اصلا همون sample های لایبری را با اضافه کردن چند تا کامنت فارسی در پروژه برای فهم بیشتر در تاپیک نمونه برنامه ها قرار بده
> البته اگه حال داشتی و وقت داشتی
> بازم دمت گرم


خواهش میکنم ، دم تو گرم که انقد گفتی تا بالاخره من رفتم سراغش  :قهقهه: 
من کلا وقتی 2-3 روز دنبال یه چیزی بگردم و پیداش نکنم بعد آخرش راه حل رو که بفهمم انقد ذوق دارم که میام واسه بقیه هم آموزش میذارم  :لبخند گشاده!: 

والا با آپدیت جدید که کار نکردم ولی فک نکنم چیز خاصی باشه ، توی همون کلاس MyDatabase کافیه DATABASE_VERSION رو یکی ببری بالا، اینطور که فهمیدم خودش بقیه کارا رو میکنه دیگه

----------


## keyvan_s89

ببخشید من تازه واردم

mydb = openOrCreateDatabase(DBNAME, Context.MODE_PRIVATE,null);
  mydb.execSQL("INSERT INTO " + TABLE + "(NAME, PLACE) VALUES('*یک دو سه*','*امتحان*')");

mydb.close();





اگه بخوام به جای Value ثابت مقادیر رو از txtview بگیرم چه جوری میشه ؟

----------


## hojjjat

سلام روش ویزادی موجود نیس؟
همانند برنامه ای دات نت؟؟

----------


## poorman

> ببخشید من تازه واردم
> 
> mydb = openOrCreateDatabase(DBNAME, Context.MODE_PRIVATE,null);
>   mydb.execSQL("INSERT INTO " + TABLE + "(NAME, PLACE) VALUES('*یک دو سه*','*امتحان*')");
> 
> mydb.close();
> 
> 
> 
> ...


سلام، برای وارد کردن اطلاعات از EditText میتونید به صورت زیر عمل کنید


String name = editTextName.getText().toString();
String place = editTextPlace.getText().toString();
mydb.execSQL("INSERT INTO " + TABLE + "(NAME, PLACE) VALUES ('" + name + "', '" + place + "')");

----------


## poorman

> سلام روش ویزادی موجود نیس؟
> همانند برنامه ای دات نت؟؟


سلام، برای ساخت دیتابیس که خب نرم افزار هست 
اما برای استفاده از دیتابیس همش برمیگرده به کد نویسی یا استفاده از کلاس ها و لایبری ها

----------


## keyvan_s89

> سلام، برای وارد کردن اطلاعات از EditText میتونید به صورت زیر عمل کنید
> 
> 
> String name = editTextName.getText().toString();
> String place = editTextPlace.getText().toString();
> mydb.execSQL("INSERT INTO " + TABLE + "(NAME, PLACE) VALUES ('" + name + "', '" + place + "')");


اپدیت و دلیت رو هم اگه یه مثال کوچولو بزنید ممنون میشم. و این که چه جوری اطلاعات خونده شده رو بریزیم تویه یه لیست ویو

----------


## hamidhtc

سلاممن تازه دارم اندرويد ياد ميگيرم ميخوام يه برنامه اندرويدي با کد نويسي بنويسم که جزوه درس انگليسمون است,مشکلي که دارم نميدونم چه جوري بايد متن اين جزورو وارد برنامه کنم لطفا کمک کنيد.

----------


## poorman

> اپدیت و دلیت رو هم اگه یه مثال کوچولو بزنید ممنون میشم. و این که چه جوری اطلاعات خونده شده رو بریزیم تویه یه لیست ویو


برای آپدیت و دیلت کردن هم دقیقا کار به همین صورته دیگه، الگو برداری کنید راحته قضیه


String value = editTextValue.getText().toString();
int id = editTextID.getText();
mydb.execSQL("update tableName set fieldName = '" + value + "' where _id = " + id);


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

----------


## poorman

> سلاممن تازه دارم اندرويد ياد ميگيرم ميخوام يه برنامه اندرويدي با کد نويسي بنويسم که جزوه درس انگليسمون است,مشکلي که دارم نميدونم چه جوري بايد متن اين جزورو وارد برنامه کنم لطفا کمک کنيد.


شما اول یک شناخت کلی از دیتابیس SQLite پیدا کنین که چطوری اطلاعات دسته بندی میشه و میشه اونها رو خوند
بعدش برای اینکه بعدا بتونین بهترین استفاده رو از دیتابیس کنین، برای اطلاعاتتون یک چارچوب مشخص تعیین کنین و بعدش اونا رو از طریق نرم افزار SQLite Browser وارد دیتابیس خودتون کنین 
مثلا اگه میخواین لغات رو ترجمه کنین، یک جدول به اسم dictionary بسازید و چند تا ستون id_ و word و meaning رو بسازید و اطلاعاتتون رو از طریق دستورهای SQL وارد دیتابیس کنید

بعد که دیتابیستون آماده شد، میاین توی این تاپیک و آموزش مربوط به استفاده از دیتابیس آماده و کار با دیتابیس رو میخونین

----------


## keyvan_s89

مشکلم حل شد

----------


## poorman

> میگم بیکار شدی یه پروژه آموزشی درباره این لایبری و آپدیت جدید بساز و در نمونه برنامه های کوچک اما مفید قرار بده که بقیه استفاده کنند.
> یا اصلا همون sample های لایبری را با اضافه کردن چند تا کامنت فارسی در پروژه برای فهم بیشتر در تاپیک نمونه برنامه ها قرار بده


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

مورد بعدی اینه که شما براتون مهم نیست کاربر اطلاعات قبلیش چی بوده، یا اصلا کاربر با دیتابیس کاری نداشته و چیزی توش وارد نکرده
که برای اینکار کافیه عدد ورژن دیتابیس رو توی کلاس MyDatabase یکی ببرید بالا و توی همون کلاس توی تابع MyDatabase بعد از متد super این کد رو بنویسید
setForcedUpgrade();

اینطوری به صورت خودکار دیتابیس قبلی پاک میشه و دیتابیس جدید جایگزین میشه

البته کاملا معلومه که فایل دیتابیس موجود در پوشه assets/databases هم باید با فایل جدید جایگزین بشه ( با همون نام قبلی )

----------


## ho3ein.3ven

جناب poorman واقعا ممنون خیلی بدردم خورد
یه سوال داشتم . چطوری مشیه count رو بدست آورد ؟ چون آرایه ها باید به صورت پویا تعریف بشه دیگه.

----------


## poorman

> جناب poorman واقعا ممنون خیلی بدردم خورد
> یه سوال داشتم . چطوری مشیه count رو بدست آورد ؟ چون آرایه ها باید به صورت پویا تعریف بشه دیگه.


درسته چون باید آرایه ها رو پویا مقدار بدید می تونید از تابع getCount استفاده کنید برای Cursor
int num = yourCursor.getCount();

----------


## ho3ein.3ven

خیلی ممنون بابت جوابتون.
ببخشید باز مزاحم شدم .
تو این روشی که گفتین کپی کردن دیتابیس آماده به چه صورتی هست ؟ اگه ممکنه یکم توضیح بدین .

----------


## poorman

خواهش میکنم، کپی کردن منظورتون چیه ؟ فایل دیتابیس رو زیپ میکنید با همون مراحلی که گفتم بعدش فایل رو میکشید و توی پوشه assets/databases ول میکنید 

بعدش برای اینکه دیتابیس شناخته بشه باید از لایبری SQLite asset helper استفاده کنین به ترتیبی که گفته شد

----------


## poorman

سلام دوستان

من میخواستم دیتابیس دو تا از برنامه هام رو با هم ترکیب کنم، مسلما زمان زیادی میبرد تا بخوام یکی یکی جدول ها رو توی دیتابیس جدید ایجاد کنم و باز دوباره اطلاعات رو وارد کنم

توی اینترنت گشتم اما راهی که به درد بخوره پیدا نکردم 
آخر سر یه راهکار اتفاقی یا ابتکاری پیدا کردم و مشکلم رو حل کردم که گفتم اینجا بگم شاید به درد کسی دیگه هم بخوره 

مواد مورد نیاز  :لبخند گشاده!:  : SQLite Database Browser , Microsoft SQL Server

نکته : اگه Microsoft SQL Server روی سیستمتون نصب نیست به نظر من بیخیال بشین  :بامزه:  چون حجمش 4 گیگ میشه تقریبا

ابتدا دیتابیسی رو که میخواین به دیتابیس اصلی اضافه کنین با نرم افزار SQLite Browser باز میکنید
بعدش از منوی file گزینه export رو انتخاب میکنید و بعد Database to SQL file 
حالا فایل رو درجای دلخواه با پسوند .sql ذخیره کنید

بعدش برید جایی که فایل رو ذخیره کردید و اون رو با Microsoft SQL Server باز کنید
می بینید که یک سری کوئری و دستورات SQL براتون اورد
حالا تمام اطلاعات در اختیار شماست و میتونید با SQLite Browser دیتابیس اصلی رو باز کنید و این کوئری ها و دستورات رو اونجا کپی کنید و بعد execute کنید ( از قسمت Execute SQL )

حتی جدول رو هم نمیخواد بسازید و دستور ساخت جدول توی همون کوئری ها وجود داره 
اطلاعات رو که وارد کردید، بعدش میتونید با ابزارهای SQLite Browser هر بلا و تغییری که خواستید سرشون در بیارید 

امیدوارم توضیحاتم کامل و مفید باشه  :لبخند:

----------


## jafaripur

> سلام دوستان
> 
> من میخواستم دیتابیس دو تا از برنامه هام رو با هم ترکیب کنم، مسلما زمان زیادی میبرد تا بخوام یکی یکی جدول ها رو توی دیتابیس جدید ایجاد کنم و باز دوباره اطلاعات رو وارد کنم
> 
> توی اینترنت گشتم اما راهی که به درد بخوره پیدا نکردم 
> آخر سر یه راهکار اتفاقی یا ابتکاری پیدا کردم و مشکلم رو حل کردم که گفتم اینجا بگم شاید به درد کسی دیگه هم بخوره 
> 
> مواد مورد نیاز  : SQLite Database Browser , Microsoft SQL Server
> 
> ...


چرا لقمه رو می پیچونی می زاری دهنت ؟  :لبخند گشاده!: 
تو SQLite با همچین چیزی می تونی این کار رو بکنی.
یک کپی از Structure جدول اولی بنویس و بعد query زیر رو بزن
INSERT INTO test1(`id`,`name`) SELECT `id`,`name` FROM test

مثلا با Navicat می تونی کپی و پیست هم بکنی.

----------


## poorman

الان یا من منظور رو متوجه نشدم یا شما منظور منو  :لبخند گشاده!: 

چون دو تا دیتابیس رو نمیشه همزمان توی SQLite باز کرد و مسلما نمیشه اطلاعات رو به همین راحتی با یک کوئری منتقل کرد

الان اینکه میگی یک کپی از stucture جدول اول بگیرم یعنی چی ؟؟؟ چطوری اینکارو بکنم ؟

----------


## jafaripur

> الان یا من منظور رو متوجه نشدم یا شما منظور منو 
> 
> چون دو تا دیتابیس رو نمیشه همزمان توی SQLite باز کرد و مسلما نمیشه اطلاعات رو به همین راحتی با یک کوئری منتقل کرد
> 
> الان اینکه میگی یک کپی از stucture جدول اول بگیرم یعنی چی ؟؟؟ چطوری اینکارو بکنم ؟


دو تا دیتابیس که سهل هستش، هر چند تا که بخوای می تونی باز کنی فرض کن 10 تا.
گرفتن Strcuture هم همون گرفتن dump از table هستش یا همون export.

----------


## ali-star

سلام دوستان

بعد از آپدیت نرم افزار به خوبی نصب میشه یعنی ارور نمیده؟؟؟ چون تو بعضی جاها گفتن استفاده از دیتابیس آماده باعث میشه تو آپدیت نرم افزار با ارور مواجه میشین...

----------


## poorman

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

مورد اول رو که من تست کردم هیچ مشکلی پیش نمیاد، مورد دوم والا هنوز امتحان نکردم، ولی با توجه به قدرتی که لایبری SQL asset helper داره فک نمیکنم اگر همه کارها رو درست انجام بدید مشکلی پیش بیاد

----------


## saeed_g21

> آپدیت دو تا حالت داره یکی اینکه دیتابیس بخواد پاک بشه و نسخه جدید جایگزین شه، یکی اینکه اطلاعات جدید به دیتابیس قبلی اضافه بشه 
> 
>  مورد اول رو که من تست کردم هیچ مشکلی پیش نمیاد، مورد دوم والا هنوز امتحان نکردم، ولی با توجه به قدرتی که لایبری SQL asset helper داره فک نمیکنم اگر همه کارها رو درست انجام بدید مشکلی پیش بیاد


کافیه واسه دیتابیس نسخه تعریف کنی بعد اگه تغییراتی در اطلاعات داخلی دیتابیس داشته باشه نسخه جدید دیتابیس رو 1+قبلی کنی بعد با دستورات مثل alter table و ... مدیریت کنی 
من به اینصورت استفاده می کنم خیلی هم راحته و جواب میشه البته بایستی به دستورات SQL اشنایی خوبی داشته باشید اینطوری حتی اطلاعات قبلی هم حذف نمیشه

----------


## akbar_online

من این مراحل انجام دادم  فقط نمی دونم از کوئری  select چجوری استفاده کنم یعنی مثلا textview  برابر فیلد مورد نظر از بانک شود

----------


## akbar_online

> بالاخره من دیشب تونستم تمام مشکلات مربوط به دیتابیس آماده رو حل کنم و ارتباط خوبی برقرار کنم با لایبری sqlite asset helper ( با تشکر از hamedjj به خاطر پافشاری روی استفاده از این لایبری )
> 
> ولی خب استفاده از این لایبری هم یکم برام گیج کننده بود که خدا رو شکر تونستم آخرش راه بندازمش
> من یه توضیح میدم واسه کسایی که میخوان با دیتابیس آماده کار کنن و مثل من به مشکل خوردن
> 
> انصافا استفاده از sqlite asset helper راحته و بسیار کارا
> یکی از مشکلاتی که من برخورد کردم توی استفاده از کلاس های دیگه، این بود که توی اندروید 10 به پایین دیتابیس رو ایجاد نمیکرد ولی این لایبری مشکل رو حل کرد
> 
> خب دوستانی که با اکلیپس کار میکنن این فایل jar رو دانلود کنن و توی پروژه مورد نظر در پوشه libs قرار بدن
> ...


من این مراحل انجام دادم  فقط نمی دونم از کوئری  select چجوری استفاده کنم یعنی مثلا textview  برابر فیلد مورد نظر از بانک شود

----------


## hamedjj

من از لایبری sqlite asset helper استفاده میکنم که تو table خودم یه ستون به نام favorite دارم برای لیست علاقه مندی ها
مقادیر این table همه no هستند که میخوام باید با کلیک رو دکمه افزودن به yes تبدیل شود

برای اجرای این عمل باید چیکار کنم؟؟

----------


## davoodi

سلام.
وقتی که از 
mydb = MyDatabase.getReadableDatabase();
در کدهام استفاده میکنم برنامه موقع اجرا خطا میده.
میتونید کمکم کنید؟

----------


## ali-star

من هم وقتی اجرا می کنم میگه نمیتونه دیتابیس رو بخونه....

مشکل حل شد یادم رفت پوشه databases رو بسازم... :لبخند گشاده!: 

---------------------------------------------------------------------------------------

دوستان حالا ما یکه دیتابیس داریم خوب...
- چطوری میتونیم اطلاعات رو از دیتابیس بگیریم؟ :متفکر:

----------


## hamedjj

> سلام.
> وقتی که از 
> mydb = MyDatabase.getReadableDatabase();
> در کدهام استفاده میکنم برنامه موقع اجرا خطا میده.
> میتونید کمکم کنید؟


دیتابیس را باید تو پوشه databases و سپس تو پوشه asset قرار بدی
شما این کار را کردید؟

کسی نیست سوال منو جواب بده؟؟؟

----------


## rezano

سلا م CRbreeze@ عزیز؛

1. یه تاپیک جدید بزن و مشکلت رو اونجا مطرح کن اینجا مربوط به کار با SQLite با استفاده از کلاس SQLiteAssetHelper هستش.
2. لوگ کت رو بزار که ببینیم چه خطایی میده.

----------


## CRbreeze

آخه من گفتم یه تاپیک جدید نزنم شاید مشکل ساز بشه 

الان درست میکنم...

----------


## shabgardetanha

سلام من تازه اندروید رو شروع کردم الان میخوام با بانک کار کنم تمام پست ها رو خوندم و اجرا کردم اما توی پوشه lib فایل جاوا رو که کپی کردم روش یک علامت قرمز و روی پوشه برنامه هم ضربدر قرمز میاد موقع اجرا هم اصلا هیچ تغییری درyouwave نمیاد انگار نه انگار که اجرا رو زدم من بانکم رو با sqlite expert  ایجاد کردم با پسوند  db بود توی پوشه asset هم  database ساختم و کپی کردم کسی ميدونه باید چکار کنم eclips م 3.4 و sqlite4
ممنون

----------


## shabgardetanha

سلام من طبق
https://barnamenevis.org/showthread.p...2-%D8%A8%D9%87
 برای کار با بانک در اندروید یه بانک sqlite ساختم با نام test.db و توی پوشه asset→databases کپی کردم فایل جار هم در lib 
این کدها رو هم نوشتم 
﻿mydtabase.java

public class MyDatabase extends SQLiteAssetHelper {

    private static final String DATABASE_NAME = "test.db";
    private static final int DATABASE_VERSION = 3;
    public MyDatabase (Context context) {

    super(context, DATABASE_NAME, null, DATABASE_VERSION);

    }

}
main.java

public class MainActivity extends ActionBarActivity {

	private MyDatabase MyData;
	private TextView txt;

    private SQLiteDatabase mydb;

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

		MyData = new MyDatabase(this);
		mydb = MyData.getReadableDatabase();

		/*mydb.execSQL("update user set name='dara' where _id=1");*/
		Cursor c=mydb.rawQuery("select * from user",null);
		if(c.getCount()==0)
		{

			mydb.execSQL("update user set name='dara' where _id=1");
		}
		txt=(TextView) findViewById(R.id.textView2);
		txt.setText("ok");    
	}
}

اما موقع اجرا پیغام unfortunately my app has stoped میدهد ممنون میشم راهنماییم کنید مشکل کارم کجاست؟

----------


## shabgardetanha

کسی نیست جواب بده..؟

----------


## rezano

shabgardetanha@ تنها راهنمایی که میشه کرد اینه که بگیم "متاسفانه برنامه شما متوقف شده است"
اینو کلی بهت میگم تا وقتی که لوگ کت رو نزاری کسی حال و حوصله تست و دیباگ برنامه ت رو نداره.
متن لوگ کت (همون خطوط قرمزی که موقع اجرا برنامه توی اندروید استادیو نمایش داده میشه) رو بزار که متوجه بشیم مشکل کجاست.
موفق باشی

----------


## hadis_a

[QUOTE=poorman;1987677]*آموزش کار با دیتابیس آماده SQLite*  برای ساخت یک دیتابیس خارجی و آماده نرم افزار* SQLite Database Browser* رو پیشنهاد میکنم   نمونه کار با دیتابیس آماده و نمایش و آپدیت اطلاعات دیتابیس رو از* این پست* دریافت کنید  -----------------------------------------------------------------------------------------------  بالاخره من دیشب تونستم تمام مشکلات مربوط به دیتابیس آماده رو حل کنم و ارتباط خوبی برقرار کنم با لایبری sqlite asset helper   ( با تشکر از hamedjj به خاطر پافشاری روی استفاده از این لایبری ) ولی خب استفاده از این لایبری هم یکم برام گیج کننده بود که خدا رو شکر تونستم آخرش راه بندازمش من یه توضیح میدم واسه کسایی که میخوان با دیتابیس آماده کار کنن و مثل من به مشکل خوردن  انصافا استفاده از sqlite asset helper راحته و بسیار کارا یکی از مشکلاتی که من برخورد کردم توی استفاده از کلاس های دیگه، این بود که توی اندروید 10 به پایین دیتابیس رو ایجاد نمیکرد ولی این لایبری مشکل رو حل کرد  خب دوستانی که با اکلیپس کار میکنن این فایل jar رو دانلود کنن و توی پروژه مورد نظر در پوشه *libs* قرار بدن  *لینک فایل jar*  توی پوشه*assets* یک پوشه به اسم *databases* بسازید  بعد دیتابیس خودتون رو* zip* کنید ( فایل دیتابیس به تنهایی باید پسوند *.db* داشته باشه )   فایل زیپ شده رو با فرمت اسم* ( DataBaseName.db.zip )* توی پوشه* databases* بذارید.* ( دقت کنید باید هم پسوند db هم پسوند zip داشته باشه )*  یعنی نمایش فایل زیپ توی ویندوز به صورت *DataBaseName.db*  و نمایش توی اکلیپس به شکل *DataBaseName.db.zip* باشه  بعدش این کلاس رو ایجاد کنین   public class MyDatabase extends SQLiteAssetHelper {  private static final String DATABASE_NAME = "DataBaseName.db"; private static final int DATABASE_VERSION = 1;  public MyDatabase (Context context) { super(context, DATABASE_NAME, null, DATABASE_VERSION); setForcedUpgrade(); } }  توی کلاسی که ایجاد کردین اسم دیتابیس خودتون رو با پسوند *db* وارد کنین  بعدش توی اکتیویتی توی متغیرهای عمومی یک نمونه از این کلاس تعریف کنید، به این صورت : private MyDatabase MyDataBase;  و بعد توی متد onCreate این خط کد رو بنویسین : MyDataBase = new MyDatabase(this);  حالا هر جایی که خواستین دیتابیس رو باز کنین، میتونین از دو تا حالت getWritableDatabase() و getReadableDatabase() که برای خوندن و نوشتن هست استفاده کنین به صورت زیر مثلا :  mydb = MyDataBase.getReadableDatabase();  وقتی getReadableDatabase استفاده میکنید، فقط عملیات خواندن رو میتونید انجام بدید  پس برای نوشتن یا آپدیت و دیلت باید از getWritableDatabase استفاده کنید  *  من از این کد استفاده کردم ولی متاسفانه دیتابیسم در مسیر data/data/pack_name/database ایجاد نشد میخاستم بدونم مشکل از کجاست تازه یه اروری هم توی logcat دارم ک میگه فولدرتون توی asset فقط readable و وقتی readable هم میزارم بازم ارور میده*    java.lang.RuntimeException: Unable to start activity ComponentInfo{com.helper.hjuybar/com.helper.hjuybar.A_bank_activity}: com.readystatesoftware.sqliteasset.SQLiteAssetHelp  er$SQLiteAssetException: Missing databases/hjuybar.db file (or .zip, .gz archive) in assets, or target folder not writable

----------


## AreF.95

سلام دوستان

یه پروژه رو کسی برام فرستاده ایراداشو برطرف کردم و از SQLiteAssetHelper هم برای وصل شدن به دیتابیس استفاده کردم مشکلی که الان وجود داره اینه که وقتی با 4.1.1 اجرا میگیرم لیست ویو رو مشاهده میکنم ولی در 5.0.0 خطا میده ...

----------


## NeoFighT

سلام ، دوستان لطفا دیگه مستقیم با خود SQlite کار نکنید ، یا از ORM استفاده کنید ، مثل Sugar , Sprinkles,.... یا از Realm استفاده کنید ، این Realm تازه اومده و انگار سرعتش خیلی بیشتر از SQlite هستش.

----------


## CodeforLife

سلام به شما و ممنونم از همه عزیزان .
انشالله خدا از شما راضی باشد  :لبخند گشاده!: 
من تازه شروع کردم و نمی دونم این راههایی که فرمودین چی هستن و اینکه آیا از هم جدا اند یا اینکه همه خوبsqllite هستن ...؟؟؟
اینکه من باید از کجا شروع کنم ؟
کدوم راه بهتره ؟
یه توضیح مختصر راجع به همه این آموزش ها به صورت کلی می فرمایید .؟
ممنونم

----------


## i love programer

سلام دوستان هرکی میتونه کمکم که دوماهه خداشاهده دارم کلنجار میرم این برنامه درست نمیشه هرکی بتونه کمکم کنه بخدا دستشو از اینجا میبوسم دیگه داره مخم سوت میکشه دیگه شک افتاده بهم که اشکال از برنامه نیست اشکال از اندروید استودیو منه.نمیدونم هرکی میتونه کمک کنه فقط  .برنامشم اینه که اطلاعات رو از کاربر میگیره ثبت میکنه تو دیتابیس


این از کلاس مدیریت دیتابیس:
*
package mehrsoft.com.app3;


import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

public class DataBaseManagment extends SQLiteOpenHelper {

public DataBaseManagment(Context context) {
super(context, "DbTest", null, 1);
    }

@Override
public void onCreate(SQLiteDatabase db) {
        String Q_CreateTable="CREATE TABLE T_Users ( "+
" UserId INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,"+
" Name   VARCHAR NOT NULL,"+
" Age    INT,"+
" Avg    REAL);";
        db.execSQL(Q_CreateTable);
        db.close();

    }


public boolean AddUser(User u)
    {
try{
            SQLiteDatabase db=this.getWritableDatabase();
            String Q1="Insert INTO T_Users(Name,Age,Avg)Values('"+u.Name+"',"+u.Age+","+u.Avg+")";
            db.execSQL(Q1);
            db.close();
return true;
        }
catch(Exception ex)
        {
return false;
        }
    }




public User GetUser(int id)
    {
        User k=new User();
        SQLiteDatabase db=this.getReadableDatabase();
        String Q1="Select * From T_Users where UserId="+id;
        Cursor C1=db.rawQuery(Q1,null);
if(C1.moveToFirst()==true)
        {
            k.Id=C1.getInt(0);
            k.Name=C1.getString(1);
            k.Age=C1.getInt(2);
            k.Avg=C1.getDouble(3);
        }

return k;
    }



@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

    }
}*

----------


## i love programer

*این از کلاس مدل :

**package* mehrsoft.com.app3;

*public class* User {
*public int* *Id*;
*public* String *Name*;
*public int* *Age*;
*public double* *Avg*;*

ـــــــــــــــــــــــــ  ـــــــــــــــــــــــــ  ـــــــــــــــــــــــــ  ـــــــــــــــــــــــــ  ـــــــــــــــــــــــــ  ـــــــــــــــــــــــــ  ـــــــــــــــــــــــــ  ــــــــــــــ

اینم از Main activity:*
*package* mehrsoft.com.app3;

*import* android.support.v7.app.AppCompatActivity;
*import* android.os.Bundle;
*import* android.view.View;
*import* android.widget.Button;
*import* android.widget.EditText;
*import* android.widget.TextView;
*import* android.widget.Toast;

*public class* MainActivity *extends* AppCompatActivity {
    Button *btnregister*;
    Button *btnsearch*;
    EditText *edtname*;
    EditText *edtid*;
    EditText *edtage*;
    EditText *edtsearch*;
    TextView *txt1*;
    DataBaseManagment *db*;

@Override
*protected void* onCreate(Bundle savedInstanceState) {
*super*.onCreate(savedInstanceState);
        setContentView(R.layout.*activity_main*);
*btnregister* = (Button) findViewById(R.id.*btnregister*);
*btnsearch* = (Button) findViewById(R.id.*btnsearch*);
*edtname* = (EditText) findViewById(R.id.*edtname*);
*edtid* = (EditText) findViewById(R.id.*edtid*);
*edtage* = (EditText) findViewById(R.id.*edtage*);
*edtsearch* = (EditText) findViewById(R.id.*edtsearch*);
*txt1* = (TextView) findViewById(R.id.*txt1*);
*btnregister*.setOnClickListener(*new* View.OnClickListener() {
@Override
*public void* onClick(View v) {
*db*=*new* DataBaseManagment(MainActivity.*this*);
                User u=*new* User();
                u.*Name*=*edtname*.getText().toString();
                u.*Age*=Integer._parseInt_(*edtage*.getText().toString());
                u.*Avg*=Double._parseDouble_(*edtid*.getText().toString());
*boolean* f= *db*.AddUser(u);
*if* (f==*true*){
                    Toast._makeText_(MainActivity.*this*,*"sabt shod"*,Toast.*LENGTH_LONG*).show();;
                }
*else* {
                    Toast._makeText_(MainActivity.*this*,*"erororor"*,Toast.*LENGTH_LONG*).show();;
                }

            }
        });
*btnsearch*.setOnClickListener(*new* View.OnClickListener() {
@Override
*public void* onClick(View v) {

*int* id=Integer._parseInt_(*edtid*.getText().toString());
                User u=*db*.GetUser(id);
*if* (u.*Id*!=0){
*txt1*.setText(u.*Age*+*" "*+u.*Avg*+*""*+u.*Name*);
                }
*else* {
                    Toast._makeText_(MainActivity.*this*,*"پیدا نشد"*,Toast.*LENGTH_LONG*).show();
*txt1*.setText(*""*);
                }
            }
        });



    }
}

----------


## i love programer

در ضمن بگم هیچ اروری نداره موقع اجرا فقط ثبت نمیکنه اطلاعات رو

----------


## melika.irani

> دیتابیس را باید تو پوشه databases و سپس تو پوشه asset قرار بدی
> شما این کار را کردید؟
> 
> کسی نیست سوال منو جواب بده؟؟؟


من یه سایت پیدا کردم اموزش کامل Sqlite داره بصورت رایگان . گفتم به اشتراک بزارم شاید برای دوستان مفید باشه
http://mehrtash-souri.com/article/6/...2%D8%B4-SQLite

----------


## hamidchi

سلام
یه برنامه میخام بنویسم که یه دیتابیس داشته باشم  و  دریافت و پرداخت های چند نفر رو بتونم توش ذخیره کنم
تعداد نفرات ممکته کم یا زیاد بشه
ستون های دیتابیس :
نام فرد - مبلغ دریافتی - مبلغ پرداختی - تاریخ

حالا سوال اینجاست برای ذخیره کردن کلیه تراکنش های یه نفر از ستون های همین دیتابیس استفاده کنم ؟ یا برای هر نفر یه دیتابیس جدا ؟ یا چی ؟ به طوری که بتونم گزارش کامل از تراکنش ها داشته باشم ؟
مثلا فرض کنید نفر اول اسمش علی هست و در ده تا تاریخ مختلف مبالغی برداشت و پرداخت کرده
میخام طوری باشه که هر وقت علی پول پرداخت یا دریافت کرد این تاریخ و مبلغ رو یه جا ذخیره کنم . حالا کجا باید ذخیره بشه ؟
..............
یا مثلا تو این برنامه های مدیریت دخل و خرج ، مثلا هزینه هایی که برای بنزین قراره ثبت بشه (به همراه تاریخش ) به چه صورت و در چه متغیرهایی ذخیره میشه ؟

----------


## naghshzan

من با این کد : 
mydb = openOrCreateDatabase(DBNAME, Context.MODE_PRIVATE,null);
            mydb.execSQL("INSERT INTO " + TABLE + "(NAME, PLACE) VALUES('یک دو سه','امتحان')");
یه جدول ساختم ولی نمیتونم اطلاعات واردش کنم ......
میشه سایتم را ببینید

----------


## opinions

دوستان یه سوال! با نرم افزار DB Browser یه دیتابیس ساختم، هیچ مشکلی هم نداره در برنامه. حالا دیتابیس رو از همون DB Browser رمزگذاری کردم، توی برنامه اصلی باید چه کدی بنویسم که رمز رو بهش نشون بدم؟ در واقع چطوری از دیتابیس خارجی رمزدار استفاده کنم؟

----------

