刚开始学java 学android 下面学习笔记,发现什么问题欢迎给位指正
在android中当需要操作SQLite数据库的时候需要得到一个SQLiteOpenHelper对象,而SQLiteOpenHelper是一个抽象类(只能够继承之后被使用),用户需要继承这个类,并实现该类中的一些方法。
SQLiteOpenHelper继承:
package DatabaseHelper; import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteDatabase.CursorFactory; import android.database.sqlite.SQLiteOpenHelper; public class DatabaseHelper extends SQLiteOpenHelper { private final static int VERSION=1; //创建sqlite必须使用SQLiteOpenHelper中的getWritableDatabase(),或getReadableDatabase() //但是SQLiteOpenHelper,是abstract类,所以必须继承后使用,在继承SQLiteOpenHelper时必须复写 //继承自父类的构造函数 public DatabaseHelper(Context context, String name, CursorFactory factory, int version) { super(context, name, factory, version); // TODO Auto-generated constructor stub } public DatabaseHelper(Context context, String name,int version) { super(context, name, null, version); // TODO Auto-generated constructor stub } public DatabaseHelper(Context context, String name) { super(context, name, null, VERSION); // TODO Auto-generated constructor stub } @Override public void onCreate(SQLiteDatabase db) { // TODO Auto-generated method stub System.out.println("sqlite is created"); //定义键值对类型,与insert的键值对对应 db.execSQL("create table user(id int,name varchar(20))"); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { // TODO Auto-generated method stub System.out.println("sqlite is updated"); } }
layout xml:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context=".MainActivity" > <Button android:id="@+id/button1" android:layout_width="fill_parent" android:layout_height="wrap_content" android:onClick="sqlitecreate" android:text="@string/createsqlite" /> <Button android:id="@+id/button2" android:layout_width="fill_parent" android:layout_height="wrap_content" android:onClick="sqliteupdate" android:text="@string/updatesqlite" /> <Button android:id="@+id/button3" android:layout_width="fill_parent" android:layout_height="wrap_content" android:onClick="sqliteinsert" android:text="@string/insertsqlite" /> <Button android:id="@+id/button4" android:layout_width="fill_parent" android:layout_height="wrap_content" android:onClick="dataupdate" android:text="@string/dataupdate" /> <Button android:id="@+id/button5" android:layout_width="fill_parent" android:layout_height="wrap_content" android:onClick="sqlitequery" android:text="@string/querysqlite" /> <Button android:id="@+id/button6" android:layout_width="fill_parent" android:layout_height="wrap_content" android:onClick="deletesqlite" android:text="@string/deletesqlite" /> <Button android:id="@+id/button7" android:layout_width="fill_parent" android:layout_height="wrap_content" android:onClick="closesqlite" android:text="@string/closesqlite" /> <Button android:id="@+id/button8" android:layout_width="fill_parent" android:layout_height="wrap_content" android:onClick="exitprogram" android:text="@string/exitprogram"/> </LinearLayout>
sqlite操作:
package com.example.sqlite; import java.sql.SQLDataException; import DatabaseHelper.DatabaseHelper; import android.os.Bundle; import android.app.Activity; import android.content.ContentValues; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.view.Menu; import android.view.View; import android.widget.Button; public class MainActivity extends Activity { /* 在button android:onclick="函数名" 但中调用 可以部再次声明, 同时避免自己编写clicklistenner private Button createbutton; private Button updatebutton; private Button insertbutton; private Button dataupdatabutton; private Button querybutton; private Button deletebutton; private Button closebutton; private Button exitbutton; */ @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); /* createbutton = (Button) findViewById(R.id.button1); updatebutton= (Button) findViewById(R.id.button2); insertbutton = (Button) findViewById(R.id.button3); dataupdatabutton = (Button) findViewById(R.id.button4); querybutton = (Button) findViewById(R.id.button5); deletebutton = (Button) findViewById(R.id.button6); closebutton = (Button) findViewById(R.id.button7); exitbutton = (Button) findViewById(R.id.button8); */ } // 创建sqlite public void sqlitecreate(View view) { // 创建sqlite必须使用SQLiteOpenHelper中的getWritableDatabase(),或getReadableDatabase() // 但是SQLiteOpenHelper,是abstract类,所以必须继承后使用,在继承SQLiteOpenHelper时必须复写 // 继承自父类的构造函数 // Create/or open a database WritableDatabase DatabaseHelper dbhelper = new DatabaseHelper(MainActivity.this, "sqlite_test3.db"); SQLiteDatabase db = dbhelper.getWritableDatabase(); System.out.println("sqlite is created"); } // 更新sqlite版本 public void sqliteupdate(View view) { DatabaseHelper dbhelper = new DatabaseHelper(MainActivity.this, "sqlite_test3.db", 2); SQLiteDatabase db = dbhelper.getWritableDatabase(); System.out.println("sqlite is updated"); } // 向sqlite插入内容 public void sqliteinsert(View view) { ContentValues values = new ContentValues(); // 键值对类型,与继承sqlteOpenHelper时sql与句定义的键值对格式一致 // db.execSQL("create table user(id int,name varchar(20))"); values.put("id", 1); values.put("name", "张三"); //values.put("id", 2); //values.put("name", "李四"); //values.put("id", 3); //values.put("name", "王五"); DatabaseHelper dbhelper = new DatabaseHelper(MainActivity.this, "sqlite_test3.db", 2); SQLiteDatabase db = dbhelper.getWritableDatabase(); db.insert("user", null, values); System.out.println("sqlite is inserted"); } // 更新内容 public void dataupdate(View view) { DatabaseHelper dbhelper = new DatabaseHelper(MainActivity.this,"sqlite_test3.db", 2); SQLiteDatabase db = dbhelper.getWritableDatabase(); ContentValues values = new ContentValues(); values.put("name", "王五"); db.update("user", values, "id=?", new String[]{"1"}); System.out.println("data is updated"); } // 查询sqlite public void sqlitequery(View view) { DatabaseHelper dbhelper = new DatabaseHelper(MainActivity.this, "sqlite_test3.db", 2); SQLiteDatabase db = dbhelper.getWritableDatabase(); Cursor cursor = db.query("user", new String[]{"id","name"}, "id=?", new String[]{"1"}, null, null, null); //cursor.moveToFirst();//刚创建 指向头部 System.out.print(cursor.moveToNext()); while (cursor.moveToNext()) { String name = cursor.getString(cursor.getColumnIndex("name")); System.out.println("query--->" + name); } System.out.println("sqlite is queryed"); } // delete sqlite public void deletesqlite(View view) { this.deleteDatabase("sqlite_test3.db"); System.out.println("sqlite is deleted"); } // exit program public void exitprogram(View view) { System.exit(0); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } }
问题:
1.多次value.put()之后 value.insert()无法一次向.db输入多个键值对:这是因为value只保存了一个键值对,insert的只是对后的一对。
2.query读取数据没有反应,是因为创建.db文件忘记了加.db后缀。
总结:
1. sqliteOpenHelper为abstract类,应该继承之后再去创建实例对象(本例当中的DatabaseHelper);
2. 对于已经存在的数据库,getWritableDatabase getReadableDatabase函数在.db文件已经存在的情况下为打开文件
3. 保存的database位于虚拟机的data/data/文件包名 当中,可点击右上角符号 pull a file from the device 导出到电脑,然后用sqlitespy等软件查看。
4.删除数据库时直接this.deleteDatabase("sqlite_test3.db");