انجمن سایت کلیدستان



آپگرید دیتابیس (در برنامه نویسی اندروید)زمان کنونی: ۱۳۹۵/۰۹/۱۴، ۱۲:۴۴ ب.ظ
کاربران در حال بازدید این موضوع: 1 مهمان
نویسنده: M@MmAd
آخرین ارسال: admin
پاسخ 10
بازدید 1293

رتبه موضوع:
  • 0 رای - 0 میانگین
  • 1
  • 2
  • 3
  • 4
  • 5
آپگرید دیتابیس (در برنامه نویسی اندروید)

آپگرید دیتابیس (در برنامه نویسی اندروید)

#1
سلام
من یه برنامه ساختم که توش از sqlite استفاده کردم
یه مشکلی هست
وقتی دیتابیس زو تغییر میدم و برنامه رو اجرا می کنم همون دیتابیس قبلی رو می خونه و حتما باید برنامه رو پاک کرد دوباره نصب کرد
ممنون میشم راهنمایی کنید
پاسخ

آپگرید دیتابیس (در برنامه نویسی اندروید)

#2
سلام.
دقیقا منظورتان از تغییر دادن دیتابیس چیست ؟ چه عملیاتی را اجرا می کنید ؟
بهتر است کدها را ذکر کنید.


 
bookbook 
لطفا برای درج کد، از دکمه مخصوص درج کد در ادیتور انجمن استفاده کنید.
در مورد برنامه نویسی، مدیران تنها راهنمایی می کنند و نوشتن برنامه نهایی، به عهده کاربران می باشد (اینجا محلی برای یادگیری است، نه سفارش کدنویسی).
کاربران باید ابتدا خود به خطایابی برنامه بپردازند، نه اینکه به محض دیدن خطا، کدها را در انجمن، copy و paste کرده و از مدیران انتظار بررسی داشته باشند.
پاسخ

آپگرید دیتابیس (در برنامه نویسی اندروید)

#3
من یه برنامه دارم که برای مطالبش از sqlite استفاده می کنم
مطالب داخل sqlite رو با استفاده از آموزش های داخل سایت داخل یک لیست ویو قرار می دم و مشکلی نداره
وقتی مطلب جدید به sqlite اضافه می کنم و دوباره برنامه رو نصب می کنم دوباره همون دیتابیس قبلی رو می خونه
حتما باید دیتا بازی رو پاک کنم تا درست بشه

ممنون
پاسخ

آپگرید دیتابیس (در برنامه نویسی اندروید)

#4
بدون دیدن کدها و شرح عملیات ها، نمیشه نظر داد.


 
bookbook 
لطفا برای درج کد، از دکمه مخصوص درج کد در ادیتور انجمن استفاده کنید.
در مورد برنامه نویسی، مدیران تنها راهنمایی می کنند و نوشتن برنامه نهایی، به عهده کاربران می باشد (اینجا محلی برای یادگیری است، نه سفارش کدنویسی).
کاربران باید ابتدا خود به خطایابی برنامه بپردازند، نه اینکه به محض دیدن خطا، کدها را در انجمن، copy و paste کرده و از مدیران انتظار بررسی داشته باشند.
پاسخ

آپگرید دیتابیس (در برنامه نویسی اندروید)

#5
سورس کامل برنامه رو بدم؟؟؟؟؟
پاسخ

آپگرید دیتابیس (در برنامه نویسی اندروید)

#6
نه، تنها بخش های مربوط به مشکل را ذکر کنید (با دکمه درج کد php در ادیتور انجمن).


 
bookbook 
لطفا برای درج کد، از دکمه مخصوص درج کد در ادیتور انجمن استفاده کنید.
در مورد برنامه نویسی، مدیران تنها راهنمایی می کنند و نوشتن برنامه نهایی، به عهده کاربران می باشد (اینجا محلی برای یادگیری است، نه سفارش کدنویسی).
کاربران باید ابتدا خود به خطایابی برنامه بپردازند، نه اینکه به محض دیدن خطا، کدها را در انجمن، copy و paste کرده و از مدیران انتظار بررسی داشته باشند.
پاسخ

آپگرید دیتابیس (در برنامه نویسی اندروید)

#7
 
کد پی‌اچ‌پی:
package **;

import java.util.ArrayList;
import java.util.List;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;
import android.widget.Toast;

public class 
DBAdapter {

    
// ebteda sotun ha ro tarif mikonim
    
public static final String KEY_ID "id";
    public static final 
String KEY_ONVAN "onvan";
    public static final 
String KEY_ENONVAN "enonvan";
    public static final 
String KEY_MATN "matn";
    public static final 
String KEY_DATE "date";
    public static final 
String KEY_ENDATE "endate";
    public static final 
String KEY_PIC1 "pic1";
    public static final 
String KEY_PIC2 "pic2";
    public static final 
String KEY_PIC3 "pic3";
    public static final 
String KEY_PIC4 "pic4";
    public static final 
String KEY_PIC5 "pic5";
    public static final 
String KEY_PIC6 "pic6";
    public static final 
String KEY_PIC7 "pic7";
    public static final 
String KEY_PIC8 "pic8";
    public static final 
String KEY_DESPIC1 "despic1";
    public static final 
String KEY_DESPIC2 "despic2";
    public static final 
String KEY_DESPIC3 "despic3";
    public static final 
String KEY_DESPIC4 "despic4";
    public static final 
String KEY_DESPIC5 "despic5";
    public static final 
String KEY_DESPIC6 "despic6";
    public static final 
String KEY_FAV "fav";
    public static final 
String KEY_KHAND "khande";
    public static final 
String KEY_EXTRA "ezafi";
    public static final 
String DATABASE_NAME "dastanha";
    public static final 
String DATABASE_TABLE "versions";
    public static final 
String TAG "FullBook Esfandune";

    
// hala nahve sakhte shodan database ro minevisim
    
static final String CREATE_TABLE "CREATE  TABLE " 
            
DATABASE_TABLE " (" 
              
KEY_ID    " INTEGER PRIMARY KEY  NOT NULL , " 
            
KEY_ONVAN " TEXT, "
            
KEY_ENONVAN " TEXT, "
            
KEY_MATN  " TEXT, " 
            
KEY_DATE  " TEXT, " 
            
KEY_ENDATE  " TEXT, " 
            
KEY_PIC1   " TEXT, " 
            
KEY_PIC2   " TEXT, " 
            
KEY_PIC3   " TEXT, " 
            
KEY_PIC4   " TEXT, " 
            
KEY_PIC5   " TEXT, " 
            
KEY_PIC6   " TEXT, " 
            
KEY_PIC7   " TEXT, " 
            
KEY_PIC8   " TEXT, " 
            
KEY_DESPIC1   " TEXT, " 
            
KEY_DESPIC2   " TEXT, " 
            
KEY_DESPIC3   " TEXT, " 
            
KEY_DESPIC4   " TEXT, " 
            
KEY_DESPIC5   " TEXT, " 
            
KEY_DESPIC6   " TEXT, " 
            
KEY_FAV   " INTEGER NOT NULL  DEFAULT 0, "
            
KEY_KHAND " INTEGER NOT NULL  DEFAULT 0, " 
            
KEY_EXTRA    " TEXT)";
    
// ye arraye vase hame gozine ha minevisim
    
String[] yek_name = new String[] { 
            
KEY_ID,
            
KEY_ONVAN,
            
KEY_MATN,
            
KEY_DATE,
            
KEY_FAV,
            
KEY_KHAND,
            
KEY_EXTRA,
            
KEY_PIC1,
            
KEY_PIC2,
            
KEY_PIC3,
            
KEY_PIC4,
            
KEY_PIC5,
            
KEY_PIC6,
            
KEY_PIC7,
            
KEY_PIC8,
            
KEY_DESPIC1,
            
KEY_DESPIC2,
            
KEY_DESPIC3,
            
KEY_DESPIC4,
            
KEY_DESPIC5,
            
KEY_DESPIC6,
            
KEY_ENONVAN,
            
KEY_ENDATE,

            };

    
// Ebteda cod hayi ke tu site gharar dadam ro inja copy konid
    // import haye lazem ro anjam midim
    // khube
    /*
     * ebteda ye nokte yi begam az inke cod haye zir ro khodeteun naneveshtid va
     * copy kardid negaran nabashid , chun neveshtan cod haye zir aslan manteghi
     * nis amuzesh haye database lynda ro ham ke negah kardan ostad , cod ha ro
     * az dakhele ye file txt copy mikard kolan neveshtan in codhaye khaste
     * konande o tekrari kare manteghi nis va behtare unhar o dark konim ta hefz
     * :) Esfandune.ir yadetun nare
     */
    
final Context context;

    
DatabaseHelper DBHelper;
    
SQLiteDatabase db;

    public 
DBAdapter(Context ctx) {
        
this.context ctx;
        
DBHelper = new DatabaseHelper(context);
    }

    private static class 
DatabaseHelper extends SQLiteOpenHelper {
        
DatabaseHelper(Context context) {
            
// DATABASE_VERSION = 1
            
super(contextDATABASE_NAMEnull1);
        }

        @
Override
        
public void onCreate(SQLiteDatabase db) {
            try {
                
db.execSQL(CREATE_TABLE);
            } catch (
SQLException e) {
                
e.printStackTrace();
            }
        }


        @
Override
        
public void onUpgrade(SQLiteDatabase dbint oldVersionint newVersion) {
            
Log.w(TAG"Upgrading database from version " oldVersion " to "
                    
newVersion ", which will destroy all old data");

            
db.execSQL("DROP TABLE IF EXISTS " DATABASE_TABLE);
            
onCreate(db);
        }
    }

    
// codhaye bala ke chize khasi nis va hamishe bayad tekrar beshan va daran
    // classe databaesemun ro
    // paye rizi mikonan
    // ---ba farakhni method e zir databesemun baz mishe va amade khandano
    //neveshtan e etelaat mishe---
    
public DBAdapter open() throws SQLException {
        
db DBHelper.getWritableDatabase();
        return 
this;
    }

    
// ---methode zir databasemun ro mibande---
    
public void close() {
        
DBHelper.close();
    }

    
// ---age gharar bud masalan ye barname hesabdari ya yaddasht besazim ke
    //karbar betune field ezafe kone niaz be in method dashtim ta karbar betune
    //etelaat ezafe kone vali dakhele barname ma niaz be in method nis
    // chun dastanha az ghabl mojud hasan va karbar faghat gharare una ro bekhune
    // pas hazfesh mikonim---
    /*public long insertContact(String id, String nam, String mavadavaliye,
            String dasturpokht, String note, String ezafi, String fav) {
        ContentValues initialValues = new ContentValues();
        /*

        return db.insert(DATABASE_TABLE, null, initialValues);
    }*/

    // ---retrieves all the contacts---
    /* in method ham ke hame dastan ha ro bar migardune , baraye nemayesh dakhele liste safhe aval*/
    
public List<DastangetAllContacts() {

        
Cursor cursor db.query(DATABASE_TABLEyek_namenullnullnull,
                
nullnull);
        List<
Dastannams cursorToList(cursor);
        return 
nams;
    }
    
    public List<
DastangetRegisteredContacts() {

        
Cursor cursor db.query(DATABASE_TABLEyek_namenullnullnull,
                
nullnull);
        List<
Dastannams = new ArrayList<Dastan>();
        
cursor.moveToFirst();
        do {
            
Dastan nam = new Dastan();
            
nam.setId(cursor.getInt(cursor.getColumnIndex(KEY_ID)));
            
nam.setMatn(cursor.getString(cursor.getColumnIndex(KEY_MATN)));
            
nam.setOnvan(cursor.getString(cursor.getColumnIndex(KEY_ONVAN)));
            
nam.setenOnvan(cursor.getString(cursor.getColumnIndex(KEY_ENONVAN)));
            
nam.setDate(cursor.getString(cursor.getColumnIndex(KEY_ENDATE)));
            
nam.setenDate(cursor.getString(cursor.getColumnIndex(KEY_ENDATE)));
            
nam.setPic1(cursor.getString(cursor.getColumnIndex(KEY_PIC1)));
            
nam.setPic2(cursor.getString(cursor.getColumnIndex(KEY_PIC2)));
            
nam.setPic3(cursor.getString(cursor.getColumnIndex(KEY_PIC3)));
            
nam.setPic4(cursor.getString(cursor.getColumnIndex(KEY_PIC4)));
            
nam.setPic5(cursor.getString(cursor.getColumnIndex(KEY_PIC5)));
            
nam.setPic6(cursor.getString(cursor.getColumnIndex(KEY_PIC6)));
            
nam.setPic7(cursor.getString(cursor.getColumnIndex(KEY_PIC7)));
            
nam.setPic8(cursor.getString(cursor.getColumnIndex(KEY_PIC8)));
            
nam.setdesPic1(cursor.getString(cursor.getColumnIndex(KEY_DESPIC1)));
            
nam.setdesPic2(cursor.getString(cursor.getColumnIndex(KEY_DESPIC2)));
            
nam.setdesPic3(cursor.getString(cursor.getColumnIndex(KEY_DESPIC3)));
            
nam.setdesPic4(cursor.getString(cursor.getColumnIndex(KEY_DESPIC4)));
            
nam.setdesPic5(cursor.getString(cursor.getColumnIndex(KEY_DESPIC5)));
            
nam.setdesPic6(cursor.getString(cursor.getColumnIndex(KEY_DESPIC6)));
            
nam.setFav(cursor.getInt(cursor.getColumnIndex(KEY_FAV)));
            
nam.setKhande(cursor.getInt(cursor.getColumnIndex(KEY_KHAND)));
            
nam.SetEzafi(cursor.getString(cursor.getColumnIndex(KEY_EXTRA)));

            
nams.add(nam);
        }while(
cursor.moveToNext());
        
        return 
nams;
    }
    
    
    
//khob, in method vase rahati e karemun dakhele method haye dige , jelogiri az tekrar cod zani
    // sakhtimesh ke cursor i ke database behemun mide ro mikkhunim va dakhele shey Dastanemun mirizim
    // 
    
private List<DastancursorToList(Cursor cursor) {
        List<
Dastannams = new ArrayList<Dastan>();
        if (
cursor.getCount() > 0) {
            while (
cursor.moveToNext()) {
                
Dastan nam = new Dastan();
                
nam.setId(cursor.getInt(cursor.getColumnIndex(KEY_ID)));
                
nam.setMatn(cursor.getString(cursor.getColumnIndex(KEY_MATN)));
                
nam.setOnvan(cursor.getString(cursor.getColumnIndex(KEY_ONVAN)));
                
nam.setenOnvan(cursor.getString(cursor.getColumnIndex(KEY_ENONVAN)));
                
nam.setDate(cursor.getString(cursor.getColumnIndex(KEY_DATE)));
                
nam.setenDate(cursor.getString(cursor.getColumnIndex(KEY_ENDATE)));
                
nam.setPic1(cursor.getString(cursor.getColumnIndex(KEY_PIC1)));
                
nam.setPic2(cursor.getString(cursor.getColumnIndex(KEY_PIC2)));
                
nam.setPic3(cursor.getString(cursor.getColumnIndex(KEY_PIC3)));
                
nam.setPic4(cursor.getString(cursor.getColumnIndex(KEY_PIC4)));
                
nam.setPic5(cursor.getString(cursor.getColumnIndex(KEY_PIC5)));
                
nam.setPic6(cursor.getString(cursor.getColumnIndex(KEY_PIC6)));
                
nam.setPic7(cursor.getString(cursor.getColumnIndex(KEY_PIC7)));
                
nam.setPic8(cursor.getString(cursor.getColumnIndex(KEY_PIC8)));
                
nam.setdesPic1(cursor.getString(cursor.getColumnIndex(KEY_DESPIC1)));
                
nam.setdesPic2(cursor.getString(cursor.getColumnIndex(KEY_DESPIC2)));
                
nam.setdesPic3(cursor.getString(cursor.getColumnIndex(KEY_DESPIC3)));
                
nam.setdesPic4(cursor.getString(cursor.getColumnIndex(KEY_DESPIC4)));
                
nam.setdesPic5(cursor.getString(cursor.getColumnIndex(KEY_DESPIC5)));
                
nam.setdesPic6(cursor.getString(cursor.getColumnIndex(KEY_DESPIC6)));
                
nam.setFav(cursor.getInt(cursor.getColumnIndex(KEY_FAV)));
                
nam.setKhande(cursor.getInt(cursor.getColumnIndex(KEY_KHAND)));
                
nam.SetEzafi(cursor.getString(cursor.getColumnIndex(KEY_EXTRA)));



                
nams.add(nam);
            };
        }
//khube , pas marahel chi shod?
        /*dakhele method haye dige query mizanim be database , bad database be ma 
         * mahale un Dastan ro mige , ma miam in methode "cursorToList" ro seda mizanim
         * va mahale Dastan ro behesh midim , "cursorToList" ham miad etelaat ro mikhune
         * va mirize dakhele ye Dastan be name "nam" va un ro be ma bar migardune :)*/
        
return nams;
    }

    
// ---in method ham ke moshakhase , ye Dastan ro bar migardune (id migire)---
    
public Dastan getContact(int new_idthrows SQLException {
        
        List<
Dastannams = new ArrayList<Dastan>();
        
        
Cursor cursor db.query(trueDATABASE_TABLEyek_nameKEY_ID
                
" == '" new_id "'"nullnullnullnullnull);
        
Dastan nam = new Dastan();
        if (
cursor != null) {
            
cursor.moveToFirst();
            
// khob inja be surate amali didid chi shod,
            // cursorToList ro farukhuni kardim ta Dastane ma ro behemun bede
            
            
nams cursorToList(cursor);
        }
        
Log.i(TAGnam.getOnvan() + ",database");
        
//chun ma faghat ye dune dastan bishtar nadashtim , pas faghat avali nams ro bar migardunim
        
return nams.get(0);
    }

    
// /search
    
public List<DastanfindContacts(String namString row)
            
throws SQLException {
        
Cursor cursor db.query(trueDATABASE_TABLEyek_namerow
                
" LIKE '%" nam "%'"nullnullnullnullnull);
        List<
Dastannams cursorToList(cursor);
        return 
nams;
    }

    
// /fav?
    
public List<DastanfindFAVContacts() throws SQLException {
        
Cursor cursor db.query(trueDATABASE_TABLEyek_nameKEY_FAV
                
" == " ""nullnullnullnullnull);

        List<
Dastannams cursorToList(cursor);
        return 
nams;
    }
    
//in methodam dastanhaye khande shode ro bar miardune
    
public List<DastanfindKhandeContacts() throws SQLException {
        
Cursor cursor db.query(trueDATABASE_TABLEyek_nameKEY_KHAND
                
" == " ""nullnullnullnullnull);

        List<
Dastannams cursorToList(cursor);
        return 
nams;
    }

    
// ---updates a contact---
    
public boolean updateContact(Dastan up_nam) {
        
ContentValues args = new ContentValues();
        
// bale in method ro faramush kardim meghdar dehi konim :D. alan mikonim
            
args.put(KEY_IDup_nam.getId());
            
args.put(KEY_ONVANup_nam.getOnvan());
            
args.put(KEY_ENONVANup_nam.getenOnvan());
            
args.put(KEY_DATEup_nam.getDate());
            
args.put(KEY_ENDATEup_nam.getenDate());
            
args.put(KEY_MATNup_nam.getMatn());
            
args.put(KEY_PIC1up_nam.getPic1());
            
args.put(KEY_PIC2up_nam.getPic2());
            
args.put(KEY_PIC3up_nam.getPic3());
            
args.put(KEY_PIC4up_nam.getPic4());
            
args.put(KEY_PIC5up_nam.getPic5());
            
args.put(KEY_PIC6up_nam.getPic6());
            
args.put(KEY_PIC7up_nam.getPic7());
            
args.put(KEY_PIC8up_nam.getPic8());
            
args.put(KEY_DESPIC1up_nam.getdesPic1());
            
args.put(KEY_DESPIC2up_nam.getdesPic2());
            
args.put(KEY_DESPIC3up_nam.getdesPic3());
            
args.put(KEY_DESPIC4up_nam.getdesPic4());
            
args.put(KEY_DESPIC5up_nam.getdesPic5());
            
args.put(KEY_DESPIC6up_nam.getdesPic6());
            
args.put(KEY_FAVup_nam.getFav());
            
args.put(KEY_KHANDup_nam.getKhande());
            
args.put(KEY_EXTRAup_nam.getEzafi());

        
        return 
db.update(DATABASE_TABLEargsKEY_ID "=" up_nam.getId(),
                
null) > 0;
    }

}
// khob class e DBAdapter emun tamum shod, ehtemalan ye sery taghirat dige badan behesh bedam :) 
 
پاسخ

آپگرید دیتابیس (در برنامه نویسی اندروید)

#8
بنده یک نگاه کلی به کدها انداختم.
ما قبل از کار با پایگاه داده، معمولا کلاس هایی را اجرا می کنیم (ساخت شیء از روی کلاس ها) و بعد از طریق روش های (methods) آنها، عملیات های مورد نظرمان را اجرا خواهیم کرد.
احتمالا مشکل اصلی از این است که در یکی از این کلاس ها یا روش های موجود در آنها، هر بار، کد ساخته شدن Table مورد نظر اجرا می شود (در صورتیکه که این عملیات تنها باید یک بار اجرا شود، یا شرط گذاشته شود که اگر Table وجود نداشت، آنگاه ساخته شود).
این بخش از کدها را دوباره بررسی کنید :

کد پی‌اچ‌پی:
@Override
public void onCreate(SQLiteDatabase db) {
    try {
        
db.execSQL(CREATE_TABLE);
    } catch (
SQLException e) {
        
e.printStackTrace();
    }


که مربوط به کلاس DatabaseHelper است (روش onCreate هم یعنی به محض ساخت شیء از روی آن کلاس، این کدها اجرا خواهند شد). در این کدها، query مربوط به ساخت Table ذکر شده است. بنابراین این بخش را حذف کنید و ببینید که مشکل برطرف می شود یا خیر.
اگر برطرف نشد، باز هم باید به دنبال اینگونه موارد در کدها باشید. البته کدهایی هم که برای استفاده از این کلاس ها می نویسید، مهم است.

bookbook 
لطفا برای درج کد، از دکمه مخصوص درج کد در ادیتور انجمن استفاده کنید.
در مورد برنامه نویسی، مدیران تنها راهنمایی می کنند و نوشتن برنامه نهایی، به عهده کاربران می باشد (اینجا محلی برای یادگیری است، نه سفارش کدنویسی).
کاربران باید ابتدا خود به خطایابی برنامه بپردازند، نه اینکه به محض دیدن خطا، کدها را در انجمن، copy و paste کرده و از مدیران انتظار بررسی داشته باشند.
پاسخ

آپگرید دیتابیس (در برنامه نویسی اندروید)

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

کد پی‌اچ‌پی:
@Override
        
public void onUpgrade(SQLiteDatabase dbint oldVersionint newVersion) {
            
Log.w(TAG"Upgrading database from version " oldVersion " to "
                    
newVersion ", which will destroy all old data");

            
db.execSQL("DROP TABLE IF EXISTS " DATABASE_TABLE);
            
onCreate(db);
        }
    } 
 
پاسخ

آپگرید دیتابیس (در برنامه نویسی اندروید)

#10
ابتدا حذف جدول (table) از پایگاه داده :

کد پی‌اچ‌پی:
db.execSQL("DROP TABLE IF EXISTS " DATABASE_TABLE); 

بعد ساخت دوباره جدول در پایگاه داده :

کد پی‌اچ‌پی:
onCreate(db); 

من اگر جای شما بودم، در پروژه اندروید، Log نویسی می کردم (کلید شماره 2719) و کل روند اجرای مربوط به پایگاه داده را بر اساس Log ها بررسی می کردم تا مشکل پیدا بشه. مثلا اینگونه متوجه می شوید که چه زمانی روش onCreate یا روش onUpgrade اجرا می شوند.

bookbook 
لطفا برای درج کد، از دکمه مخصوص درج کد در ادیتور انجمن استفاده کنید.
در مورد برنامه نویسی، مدیران تنها راهنمایی می کنند و نوشتن برنامه نهایی، به عهده کاربران می باشد (اینجا محلی برای یادگیری است، نه سفارش کدنویسی).
کاربران باید ابتدا خود به خطایابی برنامه بپردازند، نه اینکه به محض دیدن خطا، کدها را در انجمن، copy و paste کرده و از مدیران انتظار بررسی داشته باشند.
پاسخ


پرش به انجمن:


کاربران در حال بازدید این موضوع: 1 مهمان

آخرین کلیدهای غیررایگان

شما هم می توانید کلیدهای غیررایگان منتشر کنید (بیشتر بدانید)