[WP8 + SQLite] Delete Data From SQLite In Windows Phone

Sebelumnya saya pernah memposting menggenai SQLite juga tetapi baru tentang menginput data. Sekarang saya akan membahas bagaimana menghapus data dari SQLite. Project yang saya gunakan pada postingan ini adalah lanjutan dari postingan sebelumnya. Saya hanya melakukan penambahan fitur long press selected item pada listbox yang sudah pernah saya berikan.

Pada sadarnya untuk menghapus data di SQLite cukup gampang hanya membutuhkan SQL untuk mendeletenya saja. hanya saja sebelum membuat SQL kita perlu pendeklarasian SQL comment terlebih dahulu, carannya adalah dengan :

SQLiteCommand sqlComm = new SQLiteCommand(dbConn);

Setelah memiliki SQL comment sekarang anda bisa menyiapkan sintak SQL yang ingin dieksekusi dan disimpan dalam SQL comment, cara seperti di bawah ini:

 sqlComm.CommandText = "delete from task where nama = '" + Budi+ "'";

SQL diatas adalah untuk mendelete data yang dimiliki budi, ini bisa dimanipulasi dengan menganti kriterianya seperti SQL biasa. atau bisa disesuaikan dengan ini dari textbox seperti ini.

sqlComm.CommandText = "delete from task where nama = '" + textBox1.text+ "'";

Jika sudah siap SQLnya dan sudah disimpan dalam SQL comment sekarang saatnya untuk mengeksekusi SQL comment. Berikut caranya.

sqlComm.ExecuteQuery<Task>();

Penjelasan diatas adalah dasar dari cara menghapus data di SQLite, untuk implementasi penghapusannya mungkin banyak ide yang muncul dan berbeda-beda untuk setiap individu. Untuk implementasinya saya akan menambahkan fitur hapus jika ada item list yang di tekan lama (hold) maka akan ada konfirmasi penghapusan data. Cara menambahkan even hold cukup menambahkan even pada list seperti gambar di bawah ini.

delete

Sedangkan di mainpage.xml.csnya saya tambahkan kode di bawah ini yang merupakan hasil modipikasi code sebelumnya yang kita bahas.

private string potong(int urutan, string isiList) {
            string temp =string.Empty;int i=0;
            foreach (var t in isiList.ToCharArray()) {
                if (i == urutan && !t.Equals(':')) 
                    temp += t;
                else if (t.Equals(':')) 
                    i++;
            }
            return temp;
        }
        private void DataList() {
            List<Task> retrievedTasks = dbConn.Table<Task>().ToList<Task>();
            DaftarTlp.Items.Clear();
            foreach (var t in retrievedTasks)
            {
                DaftarTlp.Items.Add(t);
            }
            TBTlp.Text = string.Empty;
            TBNama.Text = string.Empty;
        }
        private void DaftarTlp_Hold(object sender, System.Windows.Input.GestureEventArgs e)
        {
            if (DaftarTlp.SelectedIndex >=0)
            {
                MessageBoxResult result=MessageBox.Show("Delete","Are you sure ?",MessageBoxButton.OKCancel);
                if (result==MessageBoxResult.OK) {
                    Task task = new Task();
                    SQLiteCommand sqlComm = new SQLiteCommand(dbConn);
                    sqlComm.CommandText = "delete from task where nama = '" + potong(1,DaftarTlp.SelectedItem.ToString()) + "'";
                    sqlComm.ExecuteQuery<Task>();
                    DataList();
                }
            }
        }

Jika item list kita hold maka akan muncul message box yang berfungsi mengkonfirmasi apakah kita benar-benar mau menghapus data item yang kita pilih. Jika user memilih iya maka data akan terhapus. Kurang lebih itu ide dari saya, jika anda memiliki ide yang berbeda silahkan dimodifikasi sesuai kebutuhan anda tetapi pada dasarnya penghapusan itu sama.. Selamat mencoba.. 🙂

[WP8 + SQLite] Insert Data With SQLite In Windows Phone

Kali ini saya akan membahas mengenai pembuatan database di Windows Phone. Sebelumnya saya pernah memperkenalkan XML, XML pada dasarnya berbeda sekali dengan sql yang biasa kita gunakan di pemrograman desktop sehingga banyak orang yang sudah biasa dengan sql merasakan kesulitan menggunakan XML. Di Windows phone SQL juga bisa digunakan melalui RDBM SQLite. Sebelum kita membuat aplikasi sederhana yang terhubung dengan database kita terlebih dahulu harus memastikan beberapa hal, diantaranya:

1. Menginstal SQLite Windows Phone

Caranya cukup pilih Tools -> Extentions and Update dan kemudian pilih tab Online dan kemudian pilih SQLite Windows Phone dan kemudian Download. Setelah didownload maka secara otomatis akan meminta restart Visual Studio anda.

2. Langkah kedua adalah menginstal Packages sqlite_net dan sqlite_net_wp8.Caranya adalah dengan memilih Tools -> Nuget Package Manager -> Manage Nuget Package for Solution. Kemudian pilih sqlite_net kemudian instal, lakukan kembali langkah dua untuk package sqlite_net_wp8

3. Menambahkan references SQLite Windows Phone dengan cara klik kanan References->Existing Item->Windows Phone pilih SQLite windows Phone.

4. Mendowload file disini https://github.com/peterhuene/sqlite-net-wp8. Setelah download silahkan di extrak dan klik kanan pada project dan pilih Add->exsiting item->cari tempat anda meng-extract file tadi dan pilih sqlite.vcxproj. File ini berfungsi sebagai penghubung antara SQLite for Windows Phone SDK dan sqlite-net NuGet package.

http://khatrishashank.files.wordpress.com/2013/12/downloadwrapper.png

5. Klik kanan pada Solution Project anda dan pilih Configuration Manager dan pilih ARM.

http://khatrishashank.files.wordpress.com/2013/12/confchange.png

Sekarang kita baru bisa mendesain aplikasi kita, kali ini saya akan membuat aplikasi untuk menampilkan buku telpon. Berikut tampilan aplikasi yang saya buat:

1

Isi dari file xml MainPage.xml adalah berikut:
<Grid x:Name="LayoutRoot" Background="Transparent">
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="*"/>
        </Grid.RowDefinitions>

        <!--TitlePanel contains the name of the application and page title-->
        <StackPanel x:Name="TitlePanel" Grid.Row="0" Margin="12,17,0,28">
            <TextBlock Text="MY APPLICATION" Style="{StaticResource PhoneTextNormalStyle}" Margin="12,0"/>
            <TextBlock Text="page name" Margin="9,-7,0,0" Style="{StaticResource PhoneTextTitle1Style}"/>
        </StackPanel>

        <!--ContentPanel - place additional content here-->
        <Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
            <TextBox x:Name="TBNama" HorizontalAlignment="Left" Height="72" Margin="188,22,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="222"/>
            <TextBlock HorizontalAlignment="Left" Margin="54,47,0,0" TextWrapping="Wrap" Text="Nama" VerticalAlignment="Top"/>
            <TextBox x:Name="TBTlp" HorizontalAlignment="Left" Height="72" Margin="188,92,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="222"/>
            <TextBlock x:Name="No_Telpon" HorizontalAlignment="Left" Margin="54,117,0,0" TextWrapping="Wrap" Text="No Telpon" VerticalAlignment="Top"/>
            <Button x:Name="BtnAdd" Content="Add" HorizontalAlignment="Left" Margin="317,169,0,0" VerticalAlignment="Top" Click="BtnAdd_Click"/>
            <ListBox Name="DaftarTlp" Margin="24,280,-24,0"></ListBox>
        </Grid>
        
    </Grid>

Setelah tampilan saatnya kita akan mulai mengubah isi dari MainPage.xml.cs, pertama kita harus membuat sebuah kelas yang berfungsi sebagai kelas enabler kolom database dengan pemprograman.

public sealed class Task
 {
     /// <summary>
     /// You can create an integer primary key and let the SQLite control it.
     /// </summary>
     [PrimaryKey, AutoIncrement]
     public int Id { get; set; }
     public string Nama { get; set; }
     public string Tlp { get; set; }
     public override string ToString(){
         return Id + ": " + Nama + " " + Tlp;
     }
 }

Letak koding diatas adalah di bawah kelas MainPage.xml.cs. Kemudian kita akan membuat sebuah perintah untuk menentukan nama database dan juga membuat konektor yang berada sebelum konstruktor MainPage().

public static string DB_PATH = Path.Combine(Path.Combine(ApplicationData.Current.LocalFolder.Path, "DBBukuTelpon.sqlite")); 
private SQLiteConnection dbConn;

Kemudian kita akan membuat event dari Tombol BtnAdd

 private void BtnAdd_Click(object sender, RoutedEventArgs e)
        {
            Task task=new Task(){
                Nama=TBNama.Text,
                Tlp=TBTlp.Text
            };
            dbConn.Insert(task);
            List<Task> retrievedTasks = dbConn.Table<Task>().ToList<Task>();
            DaftarTlp.Items.Clear();
            foreach (var t in retrievedTasks)
            {
                DaftarTlp.Items.Add(t);
            }
            TBTlp.Text = string.Empty;
            TBNama.Text = string.Empty;
        }

Jika Tombol BtnAdd diklik data yang diinput pada textboxt Nama, dan No Telpon akan disimpan ke dalam atribut Task dan akan diinsert ke tabel task. Setelah disimpan dalam tabel saatnya sekarang membaca isi dari tabel yang terbaru agar kita bisa memeriksa apakah data yang baru kita masukan sudah ada dalam tabel atau belum. Caranya adalah dengan menampilan semua data pada tabel ke dalam ListBox Daftar Telpon.

Tambahkan juga perintah di bawah ini di bawah konstruktor MainPage()

protected override void OnNavigatedTo(NavigationEventArgs e)
        {
            /// Create the database connection.
            dbConn = new SQLiteConnection(DB_PATH);
            /// Create the table Task, if it doesn't exist.
            dbConn.CreateTable<Task>();
            /// Retrieve the task list from the database.
            List<Task> retrievedTasks = dbConn.Table<Task>().ToList<Task>();
            /// Clear the list box that will show all the tasks.
            DaftarTlp.Items.Clear();
            foreach (var t in retrievedTasks)
            {
                DaftarTlp.Items.Add(t);
            }
        }

        protected override void OnNavigatedFrom(NavigationEventArgs e)
        {
            if (dbConn != null)
            {
                /// Close the database connection.
                dbConn.Close();
            }
        }

Jika sudah sampai pada tahap ini berarti maka program anda sudah selesai. Project ini hanya bisa menginput data saja sedangkan untuk penghapusan akan saya bahas pada project selanjutnya. See You.. 🙂

Solve Sql Safe Update Mode in Mysql Workbench

Just for my note when i use mysql workbench for monitor my database. When we want to delete or update file, it will return some error result that say

Error Code: 1175. You are using safe update mode and you tried to update a table without a WHERE that uses a KEY column To disable safe mode, toggle the option in Preferences -> SQL Queries and reconnect.

To fix this, you must set sql update safe first with this code :

SET SQL_SAFE_UPDATES=0;
delete from `blablabla..`

ok, finish.. hope it help…
happy coding..

How To Integrate Yii Framework And Propel

I have been done a project that require use Propel and Yii Framework to connect my application and database. Why i use Propel in Yii Framework and why not active record ? I dont like say it, but it requirement from the project. So before that, i will say about use Propel in Yii Framework :

1. Yii have active record for database, if you use Propel or any ORM you will lost Yii active record. And if you think you can use both of it, i think bad idea.

2. Some extension in Yii use Yii class that use active record. If you use Propel or another ORM, you must modify your extension. For example i use “rights” extension for user management and must modify it.

3. I dont say active record better that propel or propel better thatn active record, but for me in Yii Framework, active record is the best way to manage your database.

4. You must learn again about how to use Propel..  🙂

So this is way to integrate propel and Yii Framework :

1. create your propel

2. insert it in your project, for example insert it in directory “yourapplication/protected/vendor/propel”

3. Edit your root index.php from :

 <?php
$yii=dirname(__FILE__).'/../yii/framework/yii.php';
$config=dirname(__FILE__).'/protected/config/main.php';
defined('YII_DEBUG') or define('YII_DEBUG',true);
defined('YII_TRACE_LEVEL') or define('YII_TRACE_LEVEL',3);
require_once($yii);
Yii::createWebApplication($config)->run();

to :

 <?php
$yii=dirname(__FILE__).'/framework/yii.php';
$config=dirname(__FILE__).'/protected/config/main.php';

defined('YII_DEBUG') or define('YII_DEBUG',true);
defined('YII_TRACE_LEVEL') or define('YII_TRACE_LEVEL',3);
require_once($yii);

spl_autoload_unregister(array('YiiBase','autoload'));
require_once ('protected/vendor/propel/runtime/lib/Propel.php'); // this is your propel path

Propel::init("protected/vendor/propel/build/conf/crm-conf.php"); // this is your propel database class path
set_include_path("protected/vendor/propel/build/classes" . PATH_SEPARATOR . get_include_path());

spl_autoload_register(array('Propel', 'autoload'));
spl_autoload_register(array('YiiBase', 'autoload'));

Yii::createWebApplication($config)->run();

After that you can use propel for your application,..

Finish.. hope it help..

[Nodejs + Express] Make CRUD Operation With Mysql

Sebelumnya saya pernah posting simple example how to use nodejs dengan express untuk membuat form sederhana di https://sabitlabscode.wordpress.com/2013/07/03/nodejs-express-make-simple-form/. Tentunya tidaklah cukup hanya membuat simple form, paling tidak kita harus tahu bagaimana cara menghubungkan nodejs itu sendiri ke database. Kali ini saya akan memaparkan bagaimana membuat operasi CRUD (Create, Read, Update, Delete) pada nodejs dengan sasaran databasenya Mysql. Pertama-tama buatlah sebuah aplikasi baru dengan nodejs. Lalu hal yang kita butuhkan adalah sesuatu untuk menghubungkan nodejs dengan mysql database. Untuk itu kita perlu menginstallnya dengan cara mengetikkan code berikut pada command anda :

npm install mysql

Setelah itu definisikan module mysql pada aplikasi anda, pada app.js pastikan code konfigurasi anda seperti berikut :

 var express = require('express')
  , routes = require('./routes')
  , user = require('./routes/user')
  , http = require('http')
  , path = require('path')
  , mysql = require('mysql');

var app = express();
var connection = mysql.createConnection({
  host     : 'your host',
  user     : 'your user',
  password : 'your password',
  database : 'database name'
});

Saya asumsikan kita memiliki sebuah database dengan nama tabel “author” dimana tabel ini terdiri dari 3 buah column yaitu : id, first_name, dan last_name. Kita ingin membuat fungsi-fungsi yang dapat melakukan hal-hal berikut :

– melihat semua data pada tabel author

– melihat data detail pada tabel author

– menghapus data pada tabel author

– memperbaharui data pada tabel author

– membuat data baru

Pertama-tama, kita definisikan terlebih dahulu fungsi-fungsi di atas.

1. View All Data

Pada app.js, masukkan code berikut :

 //show all data from author table
app.get('/author', function(req, res) {
  sql='SELECT * FROM author';
  // execution sql and save result to "rows"
  connection.query(sql, function(e, rows, f) {
    if (!e) {
      //render "author" page
      //and send "rows" as "data" 
      res.render('author', {
        data: rows
      });
    }
  });
});

Kemudian pada folder “views”, buatlah file “author.jade” yang akan menampilkan user interfacenya. Masukkan code berikut pada file “author.jade” :

 extends layout

block content
  h1= title
  p Welcome to Author
  a(href="/author/new")!= "Add New Author"
  #Daftar Author
   table
    thead
     tr 
      th Firstname
      th Lastname
    tbody
    each row in data
        tr 
         td= row.first_name 
         td= row.last_name
         td
            a(href="/author/view/"+row.id)!= "View"

2. View Detail Data

Untuk menampilkan data secara detail, tambahkan kode berikut pada “app.js” :

 //view detail data
app.get('/author/view/:id', function(req, res) {
  //get parameter :id and save it in "tid"
  var tid=req.params.id;
  sql='SELECT * FROM author WHERE id='+connection.escape(tid);
  // execution query and save result to "rows"
  connection.query(sql, function(e, rows, f) {
    //check if there is error or data not found
    if (!e && (rows.length === 1)) 
    {
      //get first data and save it to "row"
      var row = rows[0];  
      //render "author_view" and send some value
      res.render('author_view', {
        title: 'New Author',
        data : row
      });
    } 
    else {
      //write error when error
        console.log(e);
    }
  });
});

Setelah itu buatlah “author_view.jade” pada folder “views” dan masukkan kode berikut :

 extends layout

block content
    h1= title
    div.newsiswa
        div
            div= data.first_name
            div= data.last_name
        a(href="/author/update/"+data.id)!= "[Update]"
        label   
        a(href="/author/delete/"+data.id)!= "[Delete]"

3. Insert New Data
Masukkan kode berikut pada app.js :

 //we have 2 request in author/new
//"get" will run when we request author/new
//and "post" will run when we do submit data
app.get('/author/new', function(req, res) {
      //render "author_new"
      res.render('author_new', {
        title: 'New Author'
      });
});

app.post('/author/new', function(req, res) {
  //get value that have been submitted
  //and save it in variable
  var fname = req.param('firstname');
  var lname = req.param('lastname');
  sql='INSERT INTO author(first_name,last_name) VALUES("'+fname+'","'+lname+'")';
  //do query
  connection.query(sql, function(e, rows, f) {
    if (!e) {
      res.redirect('/author')
    }
  });
});

dan untuk tampilannya yaitu “author_new.jade” masukkan code berikut :

 extends layout

block content
    h1= title
    div.newsiswa
        form( method="post")
            div
                div
                    span.label Firstname :
                    input(type="text", name="firstname")
                div
                    span.label Lastname :
                    input(type="text", name="lastname")
                div#editEmployeeSubmit
                    input(type="submit", value="Save")
        a(href="/author")!= "Back to Author List"

4.Updata Data
Masukkan code berikut pada app.js

 //same with author/new
//author update have 2 request
app.get('/author/update/:id', function(req, res) {
  //get parameter :id and save it to "tid"
  var tid=req.params.id;
  sql='SELECT * FROM author WHERE id='+connection.escape(tid);
  //show data to the form
  connection.query(sql, function(e, rows, f) {
    if (!e && (rows.length === 1)) 
    {
      var row = rows[0];  
      res.render('author_update', {
        title: 'Update Author'+row.first_name+' '+row.last_name,
        data : row
      });
    } 
    else {
        console.log(e);
    }
  });
});

app.post('/author/update/:id', function(req, res) {
  //get parameter :id
  var tid=req.params.id;
  //get data that have been submitted
  var fname = req.param('firstname');
  var lname = req.param('lastname');
  sql='UPDATE author SET first_name="'+fname+'",last_name="'+lname+'" WHERE id='+tid;
  //do query
  connection.query(sql, function(e, rows, f) {
    if (!e) {
      res.redirect('/author')
    }
  });
});

Lalu masukkan kode berikut pada “author_update.jade” yang telah anda buat pada folder “views”:

 extends layout

block content
    h1= title
    div.newsiswa
        form( method="post")
            div
                div
                    span.label Firstname :
                    input(type="text", name="firstname", value=data.first_name)
                div
                    span.label Lastname :
                    input(type="text", name="lastname", value=data.last_name)
                div#editEmployeeSubmit
                    input(type="submit", value="Save")
        a(href="/author")!= "Back to Author List"

5. Delete Data

Untuk delete data sendiri tidak akan memanggil tampilan suatu form, dia hanya akan mengeksekusi dan setelah itu langsung redirect ke halaman “author”, untuk itu masukkan kode seperti berikut :

 //delete data
app.get('/author/delete/:id', function(req, res) {
  // get parameter :id
  var tid=req.params.id;
  sql='DELETE FROM author WHERE id='+connection.escape(tid);
  //do query
  connection.query(sql, function(e, rows, f) {
    if (!e) 
    {
      //redirect to "/author"
      res.redirect('/author')
    } 
    else {
        console.log(e);
    }
  });
});

Itulah dia cara melakukan operasi crud pada suatu tabel dengan menggunakan msyql database.

Selesai… Hope it help.. Happy coding..

Auto Increment Trigger Oracle Not Work With Yii Framework Active Record

Sebelumnya saya telah memaparkan bagaimana cara membuat sebuah auto increment pada oracle disini. Tetapi setelah di implementasikan langsung dengan menggunakan Yii Framework ternyata trigger tersebut tidak berjalan. Perlu diketahui fungsi ini tidak berjalan ketika menggunakan active record pada Yii. Sedangkan jika anda menggunakan query builder atau DAO ini tidak masalah.  Saya menemukan hal ini dengan menggunakan Yii Framework versi 1.1.13, semoga versi selanjutnya dapat menyelesaikan masalah ini..

Mengapa tidak berjalan ? berikut alur kerja penyimpanannya menggunakan active record :

– kita mendefinisikan model

– memasukkan data

– menyimpan data , pada proses ini seharusnya sesaat sebelum insert data Yii sudah menjalankan trigger yang telah kita buat sebelumnya. Tetapi ternyata dia tidak melakukan hal tersebut melainkan langsung menyimpan dan menyebabkan error. Andaikata kita menyisipkan sebuah nilai pada field auto increment tadi, maka setelah penyimpanan berhasil dilakukan tetapi nilai dari field auto increment akan mengikuti nilai sequence kita.

Untuk mengatasi hal tersebut, maka saya putuskan untuk menghilangkan trigger yang ada pada oracle, dan membuat sendiri fungsi pada Yii yang akan selalu dijalankan sebelum proses insert data baru terjadi. Caranya cukup mudah, cukup sisipkan code beforeValidate pada model anda seperti berikut :

    public function beforeValidate()
    {
        if(Yii::app()->db->driverName=="oci")
        {

            $connection = Yii::app()->db;
            if($this->primaryKey==NULL)
            {            
                $sql = "select nama_sequence_anda.NEXTVAL from DUAL";
                $command = $connection->createCommand($sql);
                $this->primaryKey = $command->queryScalar();

            }
        }
        return parent::beforeValidate();
    }

Fungsi di atas akan selalu dijalankan sebelum data divalidasi. Pada fungsi tersebut dapat anda lihat kita melakukan cek terlebih dahulu apakah database yang dituju adalah oracle atau bukan. Kemudian ketika primary key dari data yang kita input adalah NULL (artinya dia data baru, dan tidak dijalankan untuk fungsi update) maka dia akan mengambil nilai terakhir dari sebuah sequence yang telah kita buat sebelumnya dan menyisipkannya ke dalam nilai primary key..

Auto Increment In Oracle

Bagi anda yang terbiasa menggunakan MySql dalam membangung aplikasi, mungkin sudah tidak asing lagi dengan istilah auto increment. Auto increment sendiri adalah penandaan suatu field agar setiap kali kita insert data maka field tersebut tidak perlu lagi diinput melainkan akan secara otomatis diinput dengan sebuah nilai angka yang berurutan. Misal ada field “id” dan “nama”, dimana field  “id” adalah auto increment. Ketika insert data, kita hanya perlu memasukkan nilai “nama” saja di dalam field tersebut, sedangkan field “id” akan terisi otomatis dengan suatu nilai angka yang selalu berurutan misal 1, selanjutnya 2 selanjutnya 3 dan seterusnya.

Nah, ketika anda menggunakan oracle fitur auto increment tidaklah sesederhana itu. Oracle sendiri tidak menyediakan secara langsung sebuah tipe seperti itu (auto increment).  Maka dari itu kita perlu menyisipkan suatu script di dalam oracle database untuk membuatnya dapat bekerja seolah-olah memiliki tipe auto increment.

Pertama-tama buatlah sebuah sequence pada database anda.

CREATE SEQUENCE nama_sequence
    INCREMENT BY 1 START WITH 1 NOMAXVALUE NOCYCLE NOCACHE ORDER;

Kemudian buatlah sebuah trigger dimana trigger tersebut akan selalu dijalnkan sebelum kita menyimpan suatu data baru ke tabel tersebut :

create or replace 
TRIGGER nama_trigger 
    BEFORE INSERT ON nama_tabel_anda 
      FOR EACH ROW
      BEGIN
         SELECT nama_sequence.NEXTVAL
         INTO   :new.nama_field_yang_akan_dibuat_auto_increment
         FROM   dual;
      END;

Selesai, untuk memastikan apakah sudah auto increment atau belum, cobalah menginput sebuah data dimana anda mengosongkan field yang telah anda buat auto increment pada oracle…