Wednesday, October 16, 2013

תכנות לאנדרואיד בקלות פרק 11 – בסיסי נתונים Sqlite

באפליקציית mobile יש חשיבות רבה לשמירת נתונים, החשיבות נובעת מכמה סיבות עיקריות:
1. שמירה של נתונים עבור המשתמש, העדפות שלו, הגדרות וכו.
2. במידה ואין חיבור זמין לרשת, יש לאפשר לו לעבוד במצב לא מקוון.
3. תוצאות משחקים, data של אפליקצייה – יש לשמור אותם מקומית.
4. להמעיט את הגישה לשרת לצורך אחזור של מידע קבוע, זאת על מנת לחסוך גם בסוללה וגם בעלויות של מפעיל סלולרי.
ישנן כמה דרכים לשמור מידע במכשיר שלנו, בפרק זה נתרכז בבסיס נתונים רלציוני מאוד נפוץ בשם sqlite
Sqlite נפוצה בהרבה פלטפורמות והיא מאוד רזה, אך מאפשרת פונקציונאליות כמעט מלאה כפי שתצפו מכל בסיס נתונים רלציוני.
class DB extends SQLiteOpenHelper {
    final static int DB_VERSION = 1;
final static String DB_NAME = "mydb.db";
    Context context;
    public DB(Context context) {
        super(context, DB_NAME, null, DB_VERSION);
        // Store the context for later use
        this.context = context;
    }
על מנת להתחיל לעבוד עם בסיס נתונים sqlite באפליקציית אנדרואיד אנו נשתמש במחלקה שמרחיבה את SQLiteOpenHelper, המגיעה עם בנאי ושתי מתודות שיש לממש:
onCreate(), onUpgrade()
אז מה יש לנו כאן?
1. קבוע עבור גרסת ה DB (בעת שדרוג של ה DB, נשנה את הגרסא שלנו ובמתודה onUpgrade() נחליט מה עושים.
2. קבוע שם הDB, זהו השם אשר יוענק לקובץ בסיס הנתונים במערכת הקבצים על המכשיר android שלנו.
3. Context, זאת על מנת שנעבירו לבנאי של DB
4. קריאה לsuper() של SQLiteOpenHelper עם ה context, שם ה DB, Cursor Factory (אם קיים, במקרה שלנו NULL) וגרסת ה DB.
בעת קריאה ראשונה ל DB, יווצר לנו ה DB.
בואו ניצור טבלה חדשה, כיצד נעשה זאת?
ע"י שימוש ב query כפי שאנו מכירים מ SQL/ MYSQL
@Override
public void onCreate(SQLiteDatabase database) {
    database.execSQL("CREATE TABLE employees ( _id INTEGER PRIMARY KEY "
    + "AUTOINCREMENT, name TEXT NOT NULL, ext TEXT NOT NULL, "
    + "mob TEXT NOT NULL, age INTEGER NOT NULL DEFAULT '0')");
}

יצאנו טבלה חדשה בשם employees עם העמודות:
1. _id כמפתח ראשי, כ int autoincrement
2. עמודת name כ string לא null
3. עמודת ext כ string לא null
4. עמודת mob כ string לא null
5. עמודת age כ int לא ריק כאשר כברירת מחדל יש בו 0
תשאול ה DB
ב Android, על מנת לתשאל את ה DB לקריאה בלבד, יש לקבל instance שלו, ע"י
getReadableDataBase()
ואילו על מנת לקבל instance שלו לכתיבה נקרא ל
 getWriteableDatabase().
בואו נבחן את דוגמת הקוד הבאה:
DB db = new DB(this);
SQLiteDatabase qdb = db.getReadableDatabase();
Cursor recordset1 = qdb.query("mytable", null, null, null, null, null, null);
Cursor recordset2 = qdb.rawQuery("SELECT * FROM mytable", null);
1. נייצר מופע של הDB
2. נקבל DB לקריאה – gdb
3. נייצר שאילתה לDB ע"י:
qdb.query(“mytable”, null, null, null, null, null, null);
נבחן את הפרמטרים עבור המתודה:
the table name
a string array of the column names
the WHERE clause
the selection arguments
the GROUP BY clause
theHAVING clause
and the ORDER BY clause
כולם כרגע null לכן בעצם מתבצעת
select * from mytable
4. נייצר את אותה השאילתה בדיוק ע"י
 qdb.rawquery(“Select * from mytable”, null)
כאשר הפרמטר הראשון הינו השאילתא עצמה, והפרמטר השני הוא ה
 WHERE CLAUSE