<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>نوشته های Milad khajeh</title>
        <link>https://virgool.io/feed/@miladkhajeh</link>
        <description>علاقه زیادی به کد زنی دارم .برنامه نویس اندروید/پی اچ پی</description>
        <language>fa</language>
        <pubDate>2026-06-13 23:03:35</pubDate>
        <image>
            <url>https://files.virgool.io/upload/users/40577/avatar/avatar.png?height=120&amp;width=120</url>
            <title>Milad khajeh</title>
            <link>https://virgool.io/@miladkhajeh</link>
        </image>

                    <item>
                <title>امنیت در دیتابیس در اندروید</title>
                <link>https://virgool.io/@miladkhajeh/%D8%A7%D9%85%D9%86%DB%8C%D8%AA-%D8%AF%D8%B1-%D8%AF%DB%8C%D8%AA%D8%A7%D8%A8%DB%8C%D8%B3-%D8%AF%D8%B1-%D8%A7%D9%86%D8%AF%D8%B1%D9%88%DB%8C%D8%AF-x4umfgkrcptv</link>
                <description>با سلام و خسته نباشید مدتی بدلیل فرارسیدن ایام مبارک امتحانات و درگیر مسائل شخصی بودن نبودمتو پست می خوام اموزش کتابخونه sqlCipher رو خدمت شما عزیزان ارائه بدم امیدوارم بتونم کمکتون کرده باشماین روز ها خیلی ها با یک کلیک راس ساده و خارج کردن فایل ای پی کا برنامه به منابعی از جمله (عکس ، فونت ، دیتابیس و ... دسترسی داشته باشند و خیلی راحت از اون ها استفاده کنند و هم چنین شاید ما بخوایم اطلاعات مهمی رو در دیتابیس ذخیره کنیم که بازم در خطر هست در حالت عادی به همین دلیل یه عزیزانی اومدن لطف کردن و کتابخونه sqlCipher  رو واسه ما ارائه دادن که می تونیم با کمک اون دیتابیس خودمون رو امن کنیم و به اون پس ورد بدیمخب چجوری ابتدا باید کتاخونه  اونو به گریدلمون اد کنید این خط کد رو به گریدل اپمون اضافه می کنیم و میزنیم سینک شه(دقت کنید فیلتر شکنتون طبق معمول فعال باشه)    implementation &#x27;net.zetetic:android-database-sqlcipher:3.3.1-2@aar&#x27;خب وقتی سینک انجام شد حالا می ریم سراغ پیاده سازی دیتابیس یک کلاس من ساختم به اسم MyDatabase و اکستند شده از SQLiteOpenHelper مانند زیر:public class MyDatabase extends SQLiteOpenHelper دقت کنید که از این پکیج ایمپورت شده باشه کلاسه SQLiteOpenHelper :import net.sqlcipher.database.SQLiteOpenHelper;خب اولین سازنده این کلاس رو آورراید می کنیم و با اعمال تغیرات لازم به این شکل می نویسیمش  و متد های ان کریت و ان اپدیت رو هم اورراید می کنیم    public MyDatabase(Context context){ super(context,DB_NAME, null, DB_VERSION);
SQLiteDatabase.loadLibs(context); }-نکته: دقت داشته باشید در سازنده بالا حتما و حتما این خط کد رو اضافه کنید ;;;
;(SQLiteDatabase.loadLibs(contextو در ادامه کوئری مربوط به ساخت جدول رو می نویسیید و اونو در متد ان کریت میسازیدش و به جایه مهمه پستمون رسیدیم حالا برای نوشتن و خواندن باید اینگونه استفاده کنیم     public List&lt;Model&gt; get() {        db =getReadableDatabase(DB_PASS);        List&lt;Model&gt; allData = new ArrayList&lt;&gt;();        Cursor cursor = db.rawQuery(&quot;SELECT * FROM &quot;+TABLE_NAME,null);        Toast.makeText(context, cursor.getColumnCount()+&quot;&quot;, Toast.LENGTH_SHORT).show();        if (cursor.moveToFirst()){            do {                Model userModel = new Model();                userModel.setName(cursor.getString(cursor.getColumnIndex(COLUMN_NAME)));                userModel.setTxt(cursor.getString(cursor.getColumnIndex(COLUMN_TEXT)));                allData.add(userModel);            }while (cursor.moveToNext());        }       return allData;    }این کد دقیقا عین حالت های عادی هست بغیر از این خط کد getReadableDatabase(DB_PASS); که ما باید برایه خواندن و نوشتن در دیتابیس پسورد خودمون رو وارد کنیم کلاسی که من واسه تست درش از این کتابخونه استفاده کردم این هست امیدوارم مفید باشه براتون فایل کلاس رو هم پایین ضمیمه می کنم یا علی package com.example.myapplication;import android.content.ContentValues;import android.content.Context;import android.os.AsyncTask;import android.widget.Toast;import net.sqlcipher.Cursor;import net.sqlcipher.database.SQLiteDatabase;import net.sqlcipher.database.SQLiteOpenHelper;import java.util.ArrayList;import java.util.List;public class MyDatabase extends SQLiteOpenHelper implements MethodsDatabase&lt;Model&gt; {    private static final String DB_NAME = &quot;test.db&quot;;    private static final int DB_VERSION = 1;    private static final String TABLE_NAME = &quot;test&quot;;    private static final String COLUMN_NAME = &quot;name&quot;;    private static final String COLUMN_TEXT = &quot;phone&quot;;    private static final String SQL = &quot;CREATE TABLE  IF NOT EXISTS &quot;+TABLE_NAME+ &quot; ( &quot; +            &quot;id INTEGER,&quot; +            &quot;name TEXT,&quot; +            &quot;phone TEXT);&quot;;    private static final String DB_PASS =&quot;milad&quot; ;    SQLiteDatabase db;    private Context context;    public MyDatabase(Context context) {        super(context,DB_NAME, null, DB_VERSION);        this.context = context;        SQLiteDatabase.loadLibs(context);    }    @Override    public void onCreate(SQLiteDatabase sqLiteDatabase) {        sqLiteDatabase.execSQL(SQL);    }    @Override    public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {    }    @Override    public Model get(int id) {        db = getReadableDatabase(DB_PASS);        Cursor cursor = db.rawQuery(&quot;SELECT * FROM &quot;+TABLE_NAME+&quot; WHERE id = &#x27;&quot;+id+&quot;&#x27;&quot;,null);        Model model = new Model();        if (cursor.moveToFirst()) {            model.setName(cursor.getString(cursor.getColumnIndex(COLUMN_NAME)));            model.setTxt(cursor.getString(cursor.getColumnIndex(COLUMN_TEXT)));        }        return model;    }    @Override    public List&lt;Model&gt; get() {        db =getReadableDatabase(DB_PASS);        List&lt;Model&gt; allData = new ArrayList&lt;&gt;();        Cursor cursor = db.rawQuery(&quot;SELECT * FROM &quot;+TABLE_NAME,null);        Toast.makeText(context, cursor.getColumnCount()+&quot;&quot;, Toast.LENGTH_SHORT).show();        if (cursor.moveToFirst()){            do {                Model userModel = new Model();                userModel.setName(cursor.getString(cursor.getColumnIndex(COLUMN_NAME)));                userModel.setTxt(cursor.getString(cursor.getColumnIndex(COLUMN_TEXT)));                allData.add(userModel);            }while (cursor.moveToNext());        }        return allData;    }    @Override    public void insert(Model model) {        db =getWritableDatabase(DB_PASS);        ContentValues contentValues = new ContentValues();        contentValues.put(COLUMN_NAME,model.getName());        contentValues.put(COLUMN_TEXT,model.getTxt());        db.insert(TABLE_NAME,null,contentValues);    }    @Override    public void insert(List&lt;Model&gt; listitems) {        for (int i = 0; i &lt; listitems.size(); i++) {            new InsertAsynckTasck(listitems.get(i)).execute();        }    }    @Override    public void update(int id,Model model) {        db = getWritableDatabase(DB_PASS);        ContentValues values = new ContentValues();        values.put(COLUMN_NAME,model.getName());        values.put(COLUMN_TEXT,model.getTxt());        db.update(TABLE_NAME,values,&quot;id = &quot;+id,null);    }    @Override    public void delete(int id) {    db = getWritableDatabase(DB_PASS);    db.delete(TABLE_NAME,&quot;id = &quot;+id,null);    }    class InsertAsynckTasck extends AsyncTask {        private Model userModel;        public InsertAsynckTasck(Model userModel) {            this.userModel = userModel;        }        @Override        protected Object doInBackground(Object[] objects) {            SQLiteDatabase db =getWritableDatabase(DB_PASS);            ContentValues contentValues = new ContentValues();            contentValues.put(COLUMN_NAME,userModel.getName());            contentValues.put(COLUMN_TEXT,userModel.getTxt());            db.insert(TABLE_NAME,null,contentValues);            return null;        }    }}فایل نمونه</description>
                <category>Milad khajeh</category>
                <author>Milad khajeh</author>
                <pubDate>Wed, 17 Jul 2019 12:06:35 +0430</pubDate>
            </item>
                    <item>
                <title>چند نکته مهم که همیه برنامه نویسان اندروید باهاش رو به رو هستند</title>
                <link>https://virgool.io/@miladkhajeh/%DA%86%D9%86%D8%AF-%D9%86%DA%A9%D8%AA%D9%87-%D9%85%D9%87%D9%85-%DA%A9%D9%87-%D9%87%D9%85%DB%8C%D9%87-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-%D9%86%D9%88%DB%8C%D8%B3%D8%A7%D9%86-%D8%A7%D9%86%D8%AF%D8%B1%D9%88%DB%8C%D8%AF-%D8%A8%D8%A7%D9%87%D8%A7%D8%B4-%D8%B1%D9%88-%D8%A8%D9%87-%D8%B1%D9%88-%D9%87%D8%B3%D8%AA%D9%86%D8%AF-frv5qfujhw10</link>
                <description>سلامی دوباره به شما عزیزان بازم ما مهمون چشای ناز شما هستیم خخخخخامشب داشتم یک مقاله تو سایت مدیوم میخوندم خیلی جالب بود برام و شاید همیشه منم به همین فکر میکردم(خیلی وقت پیش خیلی چند تا از دوستام هم بهم گفتن ولی قبول نمی کردم) خواستم با شما هم در میان بگذارماین متن چکیده ای از اون مقاله هست1- یک چرخه رو دوباره تکرار نکنگفته بود لازم نیست که وقت گران بهایه خودتون رو صرف ساخت کتابخانه هایی کنید که قبلا ساخته شدن و بجای صرف کردن زیاد وقت به کسب و کارتون برسید سایت اندروید آرسنال یک پایگاه داده از تمام کتاخانه های ساخته شده هست پ.ن:واقعا هم راست میگه ما خیلی وقتها سعی می کنیم خودمون رو بیهوده اثبات کنید مثلا واسه ساخت یک منوی قشنگ می گیم حتماااااااااا باید خودمون انجامش بدیم شاید یک یا چند هفته وقتمون رو تلف می کنیم که بسازیمش در صورتی که خوشکلتر از اون در اینترنت (گیت هاب و اندروید ارسنال) پیدا میشه حالا گریم ساختیمش بعد از چند هفته خیلی خوب هست  ولی میدونید چقد زمان از دست دادید چقد مسائل مهم تری می تونستید یاد بگیرید تا ساخت یک منو2- انتخاب عقلانه کتابخانهدقیقا متن مقاله:در Github بسیاری از کتابخانه های منبع باز موجود برای استفاده شما به صورت رایگان وجود دارد. اما خیلی هیجان زده نشوید و کورکورانه شروع به استفاده از کتابخانه ها نکنید!!!! تعداد ستاره هایی که در کتابخانه خاص وجود دارد را بررسی کنید، هر چه بیشتر بهتر است. بررسی کنید که آیا نویسنده این کتابخانه نیز چندین کتابخانه محبوب را ایجاد کرده است یا خیر. بررسی مسائل (هر دو باز و بسته)، که می تواند به شما درک بهتر اینکه چگونه کتابخانه در زمینه تولید و ثبات و پایدار است، ارائه می دهد. اگر  زمانی داشته باشید  ، باید کد آن کتاخبانه را بررسی کنید  و خودتون رو محک بزنید ابته اگر  واقعا ارزشش را دارد.در غیر این صورت یادتان نرود  شما فقط می خواهید اطمینان حاصل کنید کد مورد استفاده شما قابل اعتماد، بدون خطا و با کیفیت بالا است.3-بشیندید ،یک فنجان قهوه بردارید و کدهای بیشتری بخونیدما باید بیشتر وقت خود را صرف خواندن کد هایی که دیگران نوشته اند کنیم اگر این کار را انجام نمی دهید از امروز شروع کنید.هرچه کد امروز میتونید بنویسید فقط به دلیل این است یک روز ،یک جا ، یک چیزی رو شما خونده اید و یاد گرفتید این(این کدها) فقط بازتاب چیزی هست که آن ها را بلدید شما فقط وقتی رشد و پیشرفت می کنید  که کارهای دیگران را ببینید و برسی کنید و یاد بگیرید (منظورش کد و سورس های دیگران هست)یک چیز بزرگ در مورد آندروید این است که این یک پلت فرم به طور کامل با منبع باز است. به کد وارد شوید و و برسی کنید که چگونه کد در یک چارچوب پیاده سازی شده . هزاران کتابخانه منبع باز در Github وجود دارد. فقط یک کتابخانه را انتخاب کنید و ببینید که چگونه توسعه دهنده آن را پیاد سازی کرده  است.جایزه : در اینجا یک لیست از بهترین کتابخانه ها است و در اینجا لیستی از تقریبا تمام برنامه های کاربردی آندروید موجود در دسترس است. خواهش میکنم  (البته کسی تشکر نکرده الکی خودش گفته خواهش می کنم خخخخخ)4. به خاطر خدا، استانداردهای کد گذاری مناسب را حفظ کنید (خخخخخخخخخ خیلی دلش پره) اگر شما برنامه نویسی را با نوشتن مقایسه کنید، استانداردهای برنامه نویسی مانند دست خط خودتان است.همانطور که شما کد های دیگران را میخوانید آن ها هم کد های شما را میخوانند از آنها گله ای نداشته باشید ،گله دارید؟ و اگر شما در یک سازمان کار می کنید و به شدت با دیگر توسعه دهندگان همکاری می کنید، مراقبت های ویژه ای در مورد آن انجام دهید. کد شعر استاعتراض نکنید اگر یک تیکه کد نوشتید و همکارانتان برای چند روز با شما حرف نزدن ( خب درس بنویس کدتو برادر من بقول یه بنده خدایی میگه جوری ننویس که عمه بیچارت مورد لطف قرار بگیره )بقیه رو هم در پست بعدی میگم با تشکر میلاد خواجهشیفتگان پرواز رو هیچ میل به خزیدن نیست</description>
                <category>Milad khajeh</category>
                <author>Milad khajeh</author>
                <pubDate>Thu, 18 Apr 2019 00:44:39 +0430</pubDate>
            </item>
                    <item>
                <title>استفاده از دیتابیس خارجی با یک کتابخانه بسیار عالی</title>
                <link>https://virgool.io/@miladkhajeh/%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87-%D8%A7%D8%B2-%D8%AF%DB%8C%D8%AA%D8%A7%D8%A8%DB%8C%D8%B3-%D8%AE%D8%A7%D8%B1%D8%AC%DB%8C-%D8%A8%D8%A7-%DB%8C%DA%A9-%DA%A9%D8%AA%D8%A7%D8%A8%D8%AE%D8%A7%D9%86%D9%87-%D8%A8%D8%B3%DB%8C%D8%A7%D8%B1-%D8%B9%D8%A7%D9%84%DB%8C-lowlvllnjmtd</link>
                <description>استفاده از دیتابیس خارجی با یک کتابخانه بسیار عالیخیلی وقتا بعضی از برنامه نویسان یک دیتابیس رو خارج از برنامه نویسی اندروید ایجاد می کنند و میخوان وارد اندرویداستدیو کنن ولی واسشون مشکل هست و دردسر و بعضی وقتا هم حجم زیادی رو به خروجی برنامه میدهخب ما امروز می خوایم یک کتابخونه رو برسی کنیم که خیلی به ما در این امر کمک میکنه.کتابخونه Android SQLiteAssetHelper :- خب این کتابخونه چیه اصلا چه مزیت هایی داره و روش کارش چیه؟+ وایسا بابا ، الان میگم بهت چقد عجله داری(کار هر برنامه نویسی که همیشه دوس داره نتیجه کار رو ببینه)خب بگذریم این چیزا رو گفتم حال و هواتون عوض شه بریم سراغ مزیت این کتاخونهمزیت:مهمترین مزیتی که میتونیم بگیم داره اینه که فایل دیتابیس رو به صورت زیپ میخونه که همین امر باعث میشه خخخخییییییلی حجم دیتابیسمون بیاد پایین خیلی جالبه نه؟خیلی کار باهاش راحت هستو...- خب بسه دیگه بابا برو سر اینکه چجور ازش استفاده کنیم!!!!!!+چششششششمخب بریم سرغ طرز استفاده *خییییلی با دقت انجام بدید این کار ها رو*1- فایل دیتابیس رو به زیپ تبدیل می کنیم و بهش یک پسوند .db میدیم چجوری؟مثلا اسم دیتابیس ما هست mydb (وقتی میخواید به زیپ تبدیلش کنید اکثر موقع ها اسم رو ازتون میپرسه میخواید همون اسم خودش باشه یانه شما میتونید پسوند رو بهش اضافه کنید)  بعد از تبدیل به زیب اینجوری میشه mydb.db.zip که تو سیستم شاید پسوند زیپ نشون داده نشده .2-  کتابخونه Android SQLiteAssetHelper رو اد می کنیدimplementation  &#039;com.readystatesoftware.sqliteasset:sqliteassethelper:+&#039;اگر سعی کردید و اد نشد ارور میداد فایل jar این کتابخونه رو دانلود می کنید و ادد می کنید به آپتون  چجوری:خب وارد پوشه libs می شید و فایل دانلود شده رو کپی می کنید اونجا پیست می کنید خب هنوز کار تموم نشده باید رویه فایل کتابخونه کلیک راست می کنید و گزینه add as library رو انتخاب می کنید دیالوگ بازشده رو اوکی می کنید و منتظر می مونید که سینک و بیلد انجام شه و کتابخونه اد شه3- در پوشه assets اندروید استدیو یک دایرکتوری به نام databases ایجاد میکنید (دقیقا به همین اسم) و فایل زیپ دیتابیسمون که با پسوند .db هست رو در این دایرکتوری پیست می کنیم4- یک کلاس ایجاد می کنیم و اونو extends می کنیم از کلاس SQLiteAssetHelper و حالا خطا از ما میخواد کانسترکتور آن رو بسازیم Alt+Enter رو فشار می دیم و کانسترکتور رو میسازم به عکس پایین دقت کنید می فهمید کدوم کانسترکتور رو بسازید5- همینطور که در عکس بالا مشاهده می کنید  یک استرینگ به نام دیتابیسمون همراه با پسوندش به نام DATABASE_NAME تعریف کردیم(دقیقا اسم دیتابیس باید با اسم دیتابیسمون یکی باشد) و DATABASE_VERSION هم که می دونید چی هست دیگه خب بقیه کار دیگه معلوم هست و در کد سبز رنگ  سعی کردیم نشون بدیم از کدام کانسترکتور استفاده کنید اخییییشش تموم شد همه مون خسته نباشیم خخخخخخخخخ!ببخشید طولانی شد خواستم کامل و واضح توضیح داده باشم اگر سوالی بود در خدمتم با تشکر میلاد خواجهشیفتگان پرواز را هیچ میل به خزیدن نیست</description>
                <category>Milad khajeh</category>
                <author>Milad khajeh</author>
                <pubDate>Mon, 15 Apr 2019 21:59:08 +0430</pubDate>
            </item>
                    <item>
                <title>روش های رفع فیلتر اندرویداستدیو</title>
                <link>https://virgool.io/@miladkhajeh/%D8%B1%D9%88%D8%B4-%D9%87%D8%A7%DB%8C-%D8%B1%D9%81%D8%B9-%D9%81%DB%8C%D9%84%D8%AA%D8%B1-%D8%A7%D9%86%D8%AF%D8%B1%D9%88%DB%8C%D8%AF%D8%A7%D8%B3%D8%AA%D8%AF%DB%8C%D9%88-x7zekjhyyvge</link>
                <description>سلام خدمت شما برنامه نویسان عزیز و دوست داشتنی خیلی ها برای استفاده از اندروید استدیو با مشکل تحریم مواجه میشن ویا باید پول بدن وی پی ان پولی بخرن یا باید موهاشون به رنگ دندان هاشون بشه تا یه پروژه سینک بشهخخخخخخ زیاد نترسید یه چند تا راه حل هست  در زیر چندتا از پروکسی های معروف برای اندروید استدیو رو به شما عزیزان معرفی میکنیم که میتونید از اون ها استفاده کنید بنده خودم از این پروکسی ها استفاده می کنم و خیلی هم راضیم.طریقه استفاده:File &gt; Settings &gt; System Settings &gt; HTTP Proxy پروکسی ها از نظر کیفیت به ترتیب در پایین درج شده1 . پروکسی  vtwo.org Host : mirror.vtwo.org  , Port : 8850  Host : mirror1.vtwo.org   , Port : 8850  2 . پروکسی hive.irHost : android.hive.ir , Port : 80803 . پروکسی mbaas.irHost :  mirror.mbaas.ir  ,Port : 87004 . پروکسی fodev.orgHost : fodev.org  Port : 8118روش دوماستقاده از سایت شکن برای ورود به سایت روی شکن کلیک کنیداین سایت را  در یک توییت خوده اقای جهرمی هم پیشنهاد داده بود برای استفاده از این سرویس به سایت شکن مراجعه بفرماید و در بخش راهنمای استفاده از شکن خیلی ساده توضیحات لازم داده شده است با تشکر میلاد خواجهشیفتگان پرواز را هیچ میل به خزیدن نیست</description>
                <category>Milad khajeh</category>
                <author>Milad khajeh</author>
                <pubDate>Sun, 14 Apr 2019 16:45:19 +0430</pubDate>
            </item>
            </channel>
</rss>