范例:2、SQLiteProject(拼凑SQL完成数据库更新)
定义mytab表的操作类-----MytabOperate.java 加入数据库的操作方法
import android.database.sqlite.SQLiteDatabase; public class MytabOperate { // 表示要操作的数据表名称 private static final String TABLENAME = "mytab"; // 数据库操作 private SQLiteDatabase db = null; public MytabOperate(SQLiteDatabase db) { this.db = db; } public void insert(String name,String birthday) { String sql = "INSERT INTO " + TABLENAME + "(name,birthday) VALUES ('" + name + "','" + birthday + "')"; this.db.execSQL(sql) ; this.db.close() ; } public void update(int id, String name, String birthday) { String sql = "UPDATE " + TABLENAME + " SET name='" + name + "',birthday='" + birthday + "' WHERE id=" + id; this.db.execSQL(sql); this.db.close() ; } public void delete(int id) { String sql = "DELETE FROM " + TABLENAME + " WHERE id=" + id ; this.db.execSQL(sql) ; this.db.close() ; } }
定义布局管理器文件 ----- main.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"> <Button android:id="@+id/insertBut" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="增加数据" /> <Button android:id="@+id/updateBut" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="修改数据" /> <Button android:id="@+id/deleteBut" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="删除数据" /> </LinearLayout>
定义Activity程序,完成操作
import android.app.Activity; import android.database.sqlite.SQLiteOpenHelper; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; public class MySQLiteDemo extends Activity { private Button insertBut = null ; private Button updateBut = null ; private Button deleteBut = null ; // 数据库操作 private SQLiteOpenHelper helper = null ; // mytab表操作类 private MytabOperate mtab = null ; // 计数统计(以保证姓名不重复) private static int count = 0 ; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); super.setContentView(R.layout.main); // 定义数据辅助类 this.helper = new MyDatabaseHelper(this); this.insertBut = (Button) super.findViewById(R.id.insertBut) ; this.updateBut = (Button) super.findViewById(R.id.updateBut) ; this.deleteBut = (Button) super.findViewById(R.id.deleteBut) ; this.insertBut.setOnClickListener(new InsertOnClickListenerImpl()) ; this.updateBut.setOnClickListener(new UpdateOnClickListenerImpl()) ; this.deleteBut.setOnClickListener(new DeleteOnClickListenerImpl()) ; } private class InsertOnClickListenerImpl implements OnClickListener{ @Override public void onClick(View v) { MySQLiteDemo.this.mtab = new MytabOperate( // 取得可更新的数据库 MySQLiteDemo.this.helper.getWritableDatabase()); MySQLiteDemo.this.mtab.insert( "李兴华" + count++, "1979-08-12") ; } } private class UpdateOnClickListenerImpl implements OnClickListener{ @Override public void onClick(View v) { MySQLiteDemo.this.mtab = new MytabOperate( // 取得可更新的数据库 MySQLiteDemo.this.helper.getWritableDatabase()); MySQLiteDemo.this.mtab.update(3, "MLDN", "1981-06-27"); } } private class DeleteOnClickListenerImpl implements OnClickListener{ @Override public void onClick(View v) { MySQLiteDemo.this.mtab = new MytabOperate( // 取得可更新的数据库 MySQLiteDemo.this.helper.getWritableDatabase()); MySQLiteDemo.this.mtab.delete(3) ; } } }
以上程序采用的是拼凑SQL语句的形式,因此代码存在SQL注入漏洞以及无法处理一些敏感字符的问题,为了解决该问题,在开发中往往会使用占位符的形式完成。
范例:3、SQLiteProject(使用占位符)
修改MytabOperate类,使用占位符的方式完成操作
import android.database.sqlite.SQLiteDatabase; public class MytabOperate { // 表示要操作的数据表名称 private static final String TABLENAME = "mytab"; // 数据库操作 private SQLiteDatabase db = null; public MytabOperate(SQLiteDatabase db) { this.db = db; } public void insert(String name,String birthday) { String sql = "INSERT INTO " + TABLENAME + "(name,birthday) VALUES (?,?)"; Object args[] = new Object[] { name, birthday }; this.db.execSQL(sql, args); this.db.close() ; } public void update(int id, String name, String birthday) { String sql = "UPDATE " + TABLENAME + " SET name=?,birthday=? WHERE id=?"; Object args[] = new Object[] { name, birthday, id }; this.db.execSQL(sql, args); this.db.close() ; } public void delete(int id) { String sql = "DELETE FROM " + TABLENAME + " WHERE id=?"; Object args[] = new Object[] { id }; this.db.execSQL(sql,args) ; this.db.close() ; } }
在编写SQL语句时,所有要更新的内容都是用了占位符“?”表示,而随后将具体更新的数据保存在了args对象数组中,在调用execSQL()时同时传入了SQL和更新的参数,这一点在使用的形式上与JDBC中的PreparedStatement功能类似,不过却更加容易。