06-08 21:39:20.053: E/PhonePolicy(4043): Could not preload class for phone policy: com.android.internal.policy.impl.PhoneWindow$ContextMenuCallback
06-08 21:39:32.253: W/dalvikvm(4043): threadid=1: thread exiting with uncaught exception (group=0x40a851f8)
06-08 21:39:32.263: E/AndroidRuntime(4043): FATAL EXCEPTION: main
06-08 21:39:32.263: E/AndroidRuntime(4043): android.database.sqlite.SQLiteException: Can't downgrade database from version 2 to 1
06-08 21:39:32.263: E/AndroidRuntime(4043): at android.database.sqlite.SQLiteOpenHelper.onDowngrade(SQLiteOpenHelper.java:307)
06-08 21:39:32.263: E/AndroidRuntime(4043): at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:168)
06-08 21:39:32.263: E/AndroidRuntime(4043): at com.example.android_sqliterdemo.MainActivity$UpdateListener.onClick(MainActivity.java:111)
06-08 21:39:32.263: E/AndroidRuntime(4043): at android.view.View.performClick(View.java:3511)
06-08 21:39:32.263: E/AndroidRuntime(4043): at android.view.View$PerformClick.run(View.java:14110)
06-08 21:39:32.263: E/AndroidRuntime(4043): at android.os.Handler.handleCallback(Handler.java:605)
06-08 21:39:32.263: E/AndroidRuntime(4043): at android.os.Handler.dispatchMessage(Handler.java:92)
06-08 21:39:32.263: E/AndroidRuntime(4043): at android.os.Looper.loop(Looper.java:137)
06-08 21:39:32.263: E/AndroidRuntime(4043): at android.app.ActivityThread.main(ActivityThread.java:4424)
06-08 21:39:32.263: E/AndroidRuntime(4043): at java.lang.reflect.Method.invokeNative(Native Method)
06-08 21:39:32.263: E/AndroidRuntime(4043): at java.lang.reflect.Method.invoke(Method.java:511)
06-08 21:39:32.263: E/AndroidRuntime(4043): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
06-08 21:39:32.263: E/AndroidRuntime(4043): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
06-08 21:39:32.263: E/AndroidRuntime(4043): at dalvik.system.NativeStart.main(Native Method)
06-08 21:40:58.283: E/PhonePolicy(4099): Could not preload class for phone policy: com.android.internal.policy.impl.PhoneWindow$ContextMenuCallback
06-08 21:40:59.603: E/SQLiteOpenHelper(4099): Couldn't open test_m_db1 for writing (will try read-only):
06-08 21:40:59.603: E/SQLiteOpenHelper(4099): android.database.sqlite.SQLiteException: Can't downgrade database from version 2 to 1
06-08 21:40:59.603: E/SQLiteOpenHelper(4099): at android.database.sqlite.SQLiteOpenHelper.onDowngrade(SQLiteOpenHelper.java:307)
06-08 21:40:59.603: E/SQLiteOpenHelper(4099): at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:168)
06-08 21:40:59.603: E/SQLiteOpenHelper(4099): at android.database.sqlite.SQLiteOpenHelper.getReadableDatabase(SQLiteOpenHelper.java:231)
06-08 21:40:59.603: E/SQLiteOpenHelper(4099): at com.example.android_sqliterdemo.MainActivity$QueryListener.onClick(MainActivity.java:133)
06-08 21:40:59.603: E/SQLiteOpenHelper(4099): at android.view.View.performClick(View.java:3511)
06-08 21:40:59.603: E/SQLiteOpenHelper(4099): at android.view.View$PerformClick.run(View.java:14110)
06-08 21:40:59.603: E/SQLiteOpenHelper(4099): at android.os.Handler.handleCallback(Handler.java:605)
06-08 21:40:59.603: E/SQLiteOpenHelper(4099): at android.os.Handler.dispatchMessage(Handler.java:92)
06-08 21:40:59.603: E/SQLiteOpenHelper(4099): at android.os.Looper.loop(Looper.java:137)
06-08 21:40:59.603: E/SQLiteOpenHelper(4099): at android.app.ActivityThread.main(ActivityThread.java:4424)
06-08 21:40:59.603: E/SQLiteOpenHelper(4099): at java.lang.reflect.Method.invokeNative(Native Method)
06-08 21:40:59.603: E/SQLiteOpenHelper(4099): at java.lang.reflect.Method.invoke(Method.java:511)
06-08 21:40:59.603: E/SQLiteOpenHelper(4099): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
06-08 21:40:59.603: E/SQLiteOpenHelper(4099): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
06-08 21:40:59.603: E/SQLiteOpenHelper(4099): at dalvik.system.NativeStart.main(Native Method)
06-08 21:40:59.613: W/dalvikvm(4099): threadid=1: thread exiting with uncaught exception (group=0x40a851f8)
06-08 21:40:59.613: E/AndroidRuntime(4099): FATAL EXCEPTION: main
06-08 21:40:59.613: E/AndroidRuntime(4099): android.database.sqlite.SQLiteException: Can't upgrade read-only database from version 2 to 1: /data/data/com.example.android_sqliterdemo/databases/test_m_db1
06-08 21:40:59.613: E/AndroidRuntime(4099): at android.database.sqlite.SQLiteOpenHelper.getReadableDatabase(SQLiteOpenHelper.java:244)
06-08 21:40:59.613: E/AndroidRuntime(4099): at com.example.android_sqliterdemo.MainActivity$QueryListener.onClick(MainActivity.java:133)
06-08 21:40:59.613: E/AndroidRuntime(4099): at android.view.View.performClick(View.java:3511)
06-08 21:40:59.613: E/AndroidRuntime(4099): at android.view.View$PerformClick.run(View.java:14110)
06-08 21:40:59.613: E/AndroidRuntime(4099): at android.os.Handler.handleCallback(Handler.java:605)
06-08 21:40:59.613: E/AndroidRuntime(4099): at android.os.Handler.dispatchMessage(Handler.java:92)
06-08 21:40:59.613: E/AndroidRuntime(4099): at android.os.Looper.loop(Looper.java:137)
06-08 21:40:59.613: E/AndroidRuntime(4099): at android.app.ActivityThread.main(ActivityThread.java:4424)
06-08 21:40:59.613: E/AndroidRuntime(4099): at java.lang.reflect.Method.invokeNative(Native Method)
06-08 21:40:59.613: E/AndroidRuntime(4099): at java.lang.reflect.Method.invoke(Method.java:511)
06-08 21:40:59.613: E/AndroidRuntime(4099): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
06-08 21:40:59.613: E/AndroidRuntime(4099): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
06-08 21:40:59.613: E/AndroidRuntime(4099): at dalvik.system.NativeStart.main(Native Method)
下面是源代码,希望高手们能帮助我检查一下:
Activity中的代码:
package com.example.android_sqliterdemo; import com.sql.db.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.view.View.OnClickListener; import android.widget.Button; public class MainActivity extends Activity { // 声明各个组件 private Button createdb; private Button updatedb; private Button insert; private Button update; private Button query; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); getPart(); getListener(); } // 通过ID获得各个组件 public void getPart() { this.createdb = (Button) findViewById(R.id.createdb); this.updatedb = (Button) findViewById(R.id.updatedb); this.insert = (Button) findViewById(R.id.insert); this.update = (Button) findViewById(R.id.update); this.query = (Button) findViewById(R.id.query); } // 为控件绑定监听事件 public void getListener() { this.createdb.setOnClickListener(new CreatebdListener()); this.updatedb.setOnClickListener(new UpdateBDListener()); this.insert.setOnClickListener(new InsertListener()); this.update.setOnClickListener(new UpdateListener()); this.query.setOnClickListener(new QueryListener()); } // 创建各个按钮的监听事件 // 创建数据库 public class CreatebdListener implements OnClickListener { @Override public void onClick(View v) { // 实例化DatabaseHelper对象 DatabaseHelper dbHelper = new DatabaseHelper(MainActivity.this, "test_m_db1"); // 获得SQLiteDatabase对象 SQLiteDatabase db = dbHelper.getReadableDatabase(); } } // 更新数据库 public class UpdateBDListener implements OnClickListener { @Override public void onClick(View v) { // 实例化DatabaseHelper对象 DatabaseHelper db = new DatabaseHelper(MainActivity.this, "test_m_db1", 2); // 得到SQLiteDatabase对象 SQLiteDatabase database = db.getReadableDatabase(); } } // 插入数据 public class InsertListener implements OnClickListener { @Override public void onClick(View v) { // 生成ContentValues对象 ContentValues values = new ContentValues(); // 将该对象中应该插入的键值对,其中间是列名,值是希望插入这一列中值 values.put("id", 1); values.put("name", "zhangsan"); DatabaseHelper dbHelper = new DatabaseHelper(MainActivity.this, "test_m_db1",2); // 通过writer方式获得数据库 SQLiteDatabase db = dbHelper.getWritableDatabase(); // 向数据库中插入数据 表格名称、是否为空、插入的值 db.insert("users", null, values); } } // 修改数据库中的表格 public class UpdateListener implements OnClickListener { @Override public void onClick(View v) { // 获得ContetValues对象 ContentValues values = new ContentValues(); // 向values中添加键值对 values.put("name", "李四"); // 实例化DatabaseHelper对象 DatabaseHelper dbHelper = new DatabaseHelper(MainActivity.this, "test_m_db1"); // 使用writer方法获得数据库 SQLiteDatabase db = dbHelper.getWritableDatabase(); // 修改数据库中表格中数据 // 1.要更新的表格的名称 // 2.是一个ContentValues对象 // 3.where语句 ?是占位符 // 占位符处得值 db.update("users", values, "id=?", new String[] { "1" }); } } // 查询数据库中表格的数据 public class QueryListener implements OnClickListener { @Override public void onClick(View v) { // 实例化DatabaseHelper对象 DatabaseHelper dbHelper = new DatabaseHelper(MainActivity.this, "test_m_db1"); // 使用reader的方法获得SQLiteDatabse数据库 SQLiteDatabase db = dbHelper.getReadableDatabase(); //执行查寻操作 Cursor cursor=db.query("users", new String[]{"id" , "name"},"id=?",new String[]{"1"}, null, null, null); while(cursor.moveToNext()){ String name=cursor.getString(cursor.getColumnIndex("name")); System.out.println("query---->"+name); } } } }
SQLiteDataBaseHelper子类代码“
package com.sql.db; import android.content.Context; import android.database.DatabaseErrorHandler; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteDatabase.CursorFactory; import android.database.sqlite.SQLiteOpenHelper; /** * 这是一个操作数据库的助手类, * 功能:继承到了父类的构造方法和onCreate,onUpgrade方法 * 继承父类中getReadableDatabase和getWritableDatabase中操作 * @author Administrator * */ public class DatabaseHelper extends SQLiteOpenHelper { private static final int VERSION=1; //在SQLiteOpenHelper的子类中,必须包含的构造方法,作用: //1.context:activity 2.name 数据库的名称 3.cursorFactory:不知道 //4.version:数据库的版本,正数且递增 public DatabaseHelper(Context context, String name, CursorFactory factory, int version) { super(context, name, factory, version); } public DatabaseHelper(Context context, String name, CursorFactory factory, int version, DatabaseErrorHandler errorHandler) { super(context, name, factory, version, errorHandler); // TODO Auto-generated constructor stub } // 自定义两个参数的构造函数 public DatabaseHelper(Context context, String name) { this(context, name, VERSION); } public DatabaseHelper(Context context, String name, int version) { this(context, name, null, version); } public DatabaseHelper(Context context, String name, CursorFactory factory) { this(context, name, null, VERSION); } // 该函数是在第一次创建数据库的时候才能用到这个方法 @Override public void onCreate(SQLiteDatabase db) { // TODO Auto-generated method stub System.out.println("create a Database"); db.execSQL("create table users(id int,name varchar(20))"); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { // TODO Auto-generated method stub // 更新数据库,增删改的方法都得调用这个函数 System.out.println("update a Database"); } }