1.布局文件 :MainActivity.xml
<Button android:id="@+id/create_database" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="创建数据库" /> <Button android:id="@+id/add_data" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="add/data添加数据" /> <Button android:id="@+id/update_data" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="update/data修改数据" /> <Button android:id="@+id/delete_data" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="delete/data删除数据" /> <Button android:id="@+id/select_data" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="select/data查询数据" />
2.MyDatabaseHelper 类 继承 SQLiteOpenHelper
/** * Created by csl on 2018/8/9. * 对数据库进行的操作 一般4种:CRUD * C:添加Create * R:代表:查询:Retrieve * U:代表更新:Update * D删除:Delete */
------------------------------------------------------------------------------------------------------------------- public class MyDatabaseHelper extends SQLiteOpenHelper { //sql语句。 public static final String CREATE_BOOK = "create table Book" + "(" + "id integer primary key autoincrement," + "author text," + "price real," + "pages integer," + "name text)"; public static final String CREATE_CATEGORY = "create table Category(" + "id integer primary key autoincrement," + "category_name text," + "category_code integer)"; private Context mContext; //参数代表: 1:Context 2.s数据库名称, 3.允许查询数据的是返回一个Cursor ,一般传入null;4:当前数据库版本,用于对数据库进行升级。 public MyDatabaseHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) { super(context, name, factory, version); mContext = context; } @Override public void onCreate(SQLiteDatabase db) { db.execSQL(CREATE_BOOK); db.execSQL(CREATE_CATEGORY); Toast.makeText(mContext, "创建数据库成功!", Toast.LENGTH_LONG).show(); /* //添加 db.execSQL("insert into Book(name,author,pages,price)values (?,?,?,?)", new String[]{"cal", "cslAndroid", "450", "20.08"}); db.execSQL("insert into Book(name,author,pages,price)values (?,?,?,?)", new String[]{"cal222", "cslAndroid22", "453", "20.02"}); //修改 db.execSQL("update Book set price = ? where name=?", new String[]{"10.08", "cal222"}); //删除 db.execSQL("delete from Book where pages>? ", new String[]{"500"}); //查询 (特别注意:rawQuery 查询 方法 不是query ) db.rawQuery("select *from Book", null); */ } @Override //onUpgrade 一般用于数据库升级 public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { //如果数据库已存在表 Book和 Category 就删除这两张表。 db.execSQL("drop table if exists Book"); db.execSQL("drop table if exists Category"); onCreate(db); } }
3. MainActivity 类
/* * Sql:全称:Structured Query Language. 结构化查询语句。 * */ /* Android 内置轻量级关系型数据SQLite ,支持 sql语法,遵循ADID事务。 * SQLiteOpenHelper:(是一个抽象类)对数据库进行创建和升级。 * SQLiteOpenHelper:中有两个抽象方法 onCreate() 和 onUpgrade() * 在这两个方法中去 创建,升级数据库的逻辑处理。 *SQLiteOpenHelper中有两个非常重要的实例方法:getReadableDatabase() * 和 get-WritableDatabase 两个方法都可以创建或打开一个现有的数据库 * (如果有数据库直接打开,无则创建。)并且返回一个可对数据库进行读写操作的对象。 * 区别在于:当数据库不可写入(如磁盘空间以满)getReadableDatabase()返回的对象将以只读的方式去打开数据库。 * 而get-WritableDatabase :会出现异常。 * * SQLiteOpenHelper * */ /* * 使用adb shell对数据库和表进行创建的检查。 * D:\sdkconfig\sdk1\platform-tools * */ /* * 数据添加 insert() 接收3个数据 ,1:表名,2.在没有指定添加的数据情况下给 * 某些可为空的列添加为空,直接传入NULL; * 3.一个:ContentValues 对象。提供一个系列Put()方法重载,用于向ContentValuesZ中添加数据,需将表中的每列及相应的待添加输入传入即可。 * */
---------------------------------------------------------------------------------------------------------------------------------------------------------------
public class MainActivity extends AppCompatActivity { private static final String TAG = "MainActivity"; private MyDatabaseHelper dbHelper; Button create_database; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); create_database = findViewById(R.id.create_database); Button addData = findViewById(R.id.add_data); addData.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //添加数据 final SQLiteDatabase db = dbHelper.getWritableDatabase(); final ContentValues values = new ContentValues(); //开始组装第一条数据。 values.put("name", "the da Vinci Code"); values.put("author", "Dan Brown"); values.put("pages", "454"); values.put("price", "17.5"); db.insert("Book", null, values); values.clear(); //清除 Toast.makeText(MainActivity.this, "Add Data Succens", Toast.LENGTH_LONG).show(); /*开始第二条数据*/ values.put("name", "the Lost csl"); values.put("author", "Dan Brown"); values.put("pages", "520"); values.put("price", "22.5"); db.insert("Book", null, values); Toast.makeText(MainActivity.this, "Add Data Tow Succens", Toast.LENGTH_LONG).show(); //修改 Button updatebutton = findViewById(R.id.update_data); updatebutton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //dbupdate SQLiteDatabase db = dbHelper.getWritableDatabase(); ContentValues valuesupdate = new ContentValues(); valuesupdate.put("price", 23.09); /* 更新所有 name 是 : the Lost csl 这个的 价格为 23.09 . * 第一个参数 :数据库表名 * 第二个参数: * 第三个:对应sql语句中的Where 部分 * 第四个: 聚特更新的哪一行 (这里更新 所有name 为 ?的行。而 ?是占位符。 * 可以通过第四个参数提供的字符串组为第三个参数中得到占位符指定相应内容) * * */ db.update("Book", values, "name=?", new String[] { "the Lost csl" }); } }); Toast.makeText(MainActivity.this, "Update修改 Data Tow success", Toast.LENGTH_LONG).show(); } }); //删除 /*删除 delete() 方法接收3个参数 1.表名 2: * 3:参数用于约束删除某一行或几行的数据,不指定默认就是删除所有行。 * * */ Button delete_data = findViewById(R.id.delete_data); delete_data.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { SQLiteDatabase db = dbHelper.getWritableDatabase(); /* 删除 pages 大于500的 */ db.delete("Book", "pages>?", new String[] {"500"}); Log.e(TAG, "删除数据成功!"); Toast.makeText(MainActivity.this, "delete is success", Toast.LENGTH_LONG).show(); } }); // 查询 (最复杂的操作) /* SQLiteDatabase提供 query()方法查询。 * query() 需要出入7 隔参数 (最短的传入7个 ) * 1参数:表名 * 2参数:指定去查几列。不指定查所有 默认 * 3.参数和 4参数: 用于约束查询某一行或几行的数据。不指定查所有行 默认 * 5参数:用于指定需要 GROUP by 的列.不指定表示不对查询结果进行 group by 操作 * 6参数:对 group by 之后的数据 进行一步过滤,不指定表示不过滤 * 7参数:用于将指定查询结果对的排序方式,不指定表示使用默认的排序方式。 * * 调用 query() 方法后放回 一个 Cursor对象,查询到的所有数据都将从这个对象中取出。 * * */ Button select_data = findViewById(R.id.select_data); select_data.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { SQLiteDatabase db = dbHelper.getWritableDatabase(); Cursor cursor = db.query("Book", null, null, null, null, null, null); //cursor.moveToFirst: 将数据的指针移动到第一行。 开始进入循环,遍历查询到每一行数据。 if (cursor.moveToFirst()) { do { //cursor.getColumnIndex("name") 获取到某一列在表中对应位置的索引 String name = cursor.getString(cursor.getColumnIndex("name")); String author = cursor.getString(cursor.getColumnIndex("author")); int pages = cursor.getInt(cursor.getColumnIndex("pages")); double price = cursor.getDouble(cursor.getColumnIndex("price")); Log.e("MainSql----", "名称:" + name + "作者:" + author + "页数:" + pages + "价格:" + price); } while (cursor.moveToNext()); } cursor.close(); Toast.makeText(MainActivity.this, "Select查询 Data Tow Succens", Toast.LENGTH_LONG).show(); } }); //指定数据库名称 dbHelper = new MyDatabaseHelper(this, "BookStore.db", null, 2); create_database.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { dbHelper.getWritableDatabase(); } }); } }