`
xihuan&java
  • 浏览: 159663 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

android sqlite

阅读更多
今天做项目的时候为了测试我把模拟器里的项目删除了,然后重新运行项目报
09-26 06:47:23.822: ERROR/AndroidRuntime(781): java.lang.RuntimeException: Unable to start receiver com.noteWidget.Note: android.database.sqlite.SQLiteException: Can't upgrade read-only database from version 0 to 1: /data/data/com.noteWidget/databases/note_db
rollback ,和数据库不能打开异常

我在网上求助,多亏好友郑方提醒rollback然后我同事又帮我看了下,这时我才想起上次我在创建表的方法里把数据库给关了


public class CourseDAO extends SQLiteOpenHelper{

private final static String DATABASE_NAME="course_db";
private final static int    DATABASE_VERSION=1;
private final static String TABLE_NAME1="course_table";
public final  static String COURSE_ID="_id";
    public final  static String COURSE_NAME="course_name";
    public final  static String COURSE_TEACHER="course_teacher";
    public final  static String COURSE_DATE="course_time";
    public final  static String COURSE_ADDRESS="course_address";
    public final  static String COURSE_NUMBER="course_number";
    private  SQLiteDatabase db;
    public String CREATE_TABLE_SQL ="CREATE TABLE "+ TABLE_NAME1 +"("+ COURSE_ID
+" INTEGER primary key autoincrement,"  + " "
+ COURSE_NAME + " text ," + " "+ COURSE_TEACHER + " text," + " "+ COURSE_DATE + " text" +
"," + " "+ COURSE_ADDRESS + " text," + " "+ COURSE_NUMBER + " text)";
  
public CourseDAO(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
// TODO Auto-generated constructor stub
}

@Override
public void onCreate(SQLiteDatabase db) {
String courseTable = "CREATE TABLE "+ TABLE_NAME1 +"("+ COURSE_ID
+" INTEGER primary key autoincrement,"  + " "
+ COURSE_NAME + " text ," + " "+ COURSE_TEACHER + " text," + " "+ COURSE_DATE + " text" +
"," + " "+ COURSE_ADDRESS + " text," + " "+ COURSE_NUMBER + " text)";
db.execSQL(courseTable);

}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("DROP TABLE IF EXISTS course_table");
        onCreate(db);

}

/*根据星期查询*/
public Cursor queryByWeek(String week)
{
SQLiteDatabase dbDatabase = getReadableDatabase();
Cursor cursor =dbDatabase.query(TABLE_NAME1,
new String[]{COURSE_ID,
COURSE_NAME,
COURSE_TEACHER,
COURSE_DATE,
COURSE_ADDRESS,
COURSE_NUMBER},
"course_table.course_time="+"'"+week+"'", null, null, null, "course_table.course_number asc");
    return cursor;
}
/*根据Id查询*/
public Cursor queryByInfoIdCursor(int infoId)
{
SQLiteDatabase dbDatabase = getReadableDatabase();
Cursor cursor =dbDatabase.query(TABLE_NAME1,new String[]{COURSE_ID,COURSE_TEACHER,COURSE_ADDRESS}, "course_table._id="+infoId, null, null, null, null);
    return cursor;
}
/*根据Id查询*/
public Cursor queryByInfoId(int infoId)
{
SQLiteDatabase dbDatabase = getReadableDatabase();
Cursor cursor =dbDatabase.query(TABLE_NAME1,new String[]{COURSE_NAME,COURSE_NUMBER,COURSE_TEACHER,COURSE_ADDRESS}, "course_table._id="+infoId, null, null, null, null);
    return cursor;
}
/*根据上课时间和上课节次查询*/
public Cursor queryByTimeAndNumber(String time,String number)
{
SQLiteDatabase db = getWritableDatabase();
String sql="select  p._id,p.course_name" +
" from course_table as p where p.course_time="+"'"+time+"'" +"and p.course_number="+"'"+number+"'" ;
Cursor cursor=db.rawQuery(sql, null);
return cursor;

}
/*插入课程信息*/
public long course_insert(String name,String teacher,String date,String address,String number){
SQLiteDatabase dbDatabase=getWritableDatabase();
ContentValues cValues=new ContentValues();
cValues.put(COURSE_NAME, name);
cValues.put(COURSE_TEACHER,teacher);
cValues.put(COURSE_DATE,date);
cValues.put(COURSE_ADDRESS,address);
cValues.put(COURSE_NUMBER,number);
long row=dbDatabase.insert(TABLE_NAME1, null, cValues);
//sub_insert((int)row, subGroup);
return row;
}
/*更改课程信息*/
public long course_update(int id,String name,String teacher,String date,String address,String number){
SQLiteDatabase dbDatabase=getWritableDatabase();
ContentValues cValues=new ContentValues();
cValues.put(COURSE_NAME, name);
cValues.put(COURSE_TEACHER,teacher);
cValues.put(COURSE_DATE,date);
cValues.put(COURSE_ADDRESS,address);
cValues.put(COURSE_NUMBER,number);
String where = COURSE_ID+"= ?";
String[] whereValue={Integer.toString(id)};
long row=dbDatabase.update(TABLE_NAME1, cValues,where ,whereValue);
//sub_insert((int)row, subGroup);
return row;
}
//删除课程信息
public void deleteCourse(int id)
{

SQLiteDatabase db = getWritableDatabase();
String where = COURSE_ID+ "= ?";
String[] whereValue={Integer.toString(id)};
db.delete(TABLE_NAME1, where, whereValue);

}
分享到:
评论
11 楼 xihuan&java 2010-10-13  
woshayawo 写道
xihuan&java 写道
woshayawo 写道
你好,请问如果是这种错误,数据库应该如何打开呢,我的也是类似的报错:can't upgrade read-only database from version 0 to 1


看一下SQLiteOpenHelper.java:170是不是有问题




一下午都解决不了,最后放弃了使用ContentProvider的方法,直接操作进行中!


看你的日志是说SQLiteOpenHelper的第170行有错,ContentProvider我也没用过,还真不太熟悉,共同努力吧
10 楼 woshayawo 2010-10-12  
xihuan&java 写道
woshayawo 写道
你好,请问如果是这种错误,数据库应该如何打开呢,我的也是类似的报错:can't upgrade read-only database from version 0 to 1


看一下SQLiteOpenHelper.java:170是不是有问题




一下午都解决不了,最后放弃了使用ContentProvider的方法,直接操作进行中!
9 楼 woshayawo 2010-10-12  
xihuan&java 写道
woshayawo 写道
你好,请问如果是这种错误,数据库应该如何打开呢,我的也是类似的报错:can't upgrade read-only database from version 0 to 1


看一下SQLiteOpenHelper.java:170是不是有问题



又奋斗了半天,还是没有头绪,SQLiteOpenHelper.java没有问题,我再考虑放弃使用ContentProvider了,非常非常感谢朋友的热心相助,如果我发现解决方案,肯定跟帖!
8 楼 xihuan&java 2010-10-12  
woshayawo 写道
你好,请问如果是这种错误,数据库应该如何打开呢,我的也是类似的报错:can't upgrade read-only database from version 0 to 1


看一下SQLiteOpenHelper.java:170是不是有问题
7 楼 woshayawo 2010-10-12  
xihuan&java 写道
woshayawo 写道
xihuan&java 写道
woshayawo 写道
xihuan&java 写道
 
woshayawo 写道
你好,请问如果是这种错误,数据库应该如何打开呢,我的也是类似的报错:can't upgrade read-only database from version 0 to 1


你可以通过下面的命令查看你是否创建了表
在Linux下查看数据库文件
1.cmd>adb shell
2.cd data/data
3.ls查看文件
4.进入要查看数据库的项目名
5.ls
6.cd databases
7.ls
8.sqlite3 “数据库名”
9.  .tables


你好,首先非常感谢你能够在百忙之中给予回复,我创建了表,在SQLite客户端也能够正常执行,我是在客户端创建的数据库和表,并插入了表数据,但我在运行写的android程序时却报这种错误,是不是还要有个步骤打开数据库啊,我ContentProvider写的也没问题。


在创建数据库类onCreate(SQLiteDatabase db)方法里你把数据库关闭了吗?




没有,我方法如下:
public void onCreate(SQLiteDatabase db) {
db.execSQL("CREATE TABLE list(_id INTEGER PRIMARY KEY,"
   + "num TEXT," + "area TEXT," + "t TEXT);");
}

就没有了,没有关闭数据库的操作。希望能得到你的指点!




数据库版本:DATABASE_VERSION=1;
//数据库构造方法
public ToDoDB(Context context)
{
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
//创建数据库方法
public void onCreate(SQLiteDatabase db) {
/*创建表info*/
String infoSql="CREATE TABLE "+ TABLE_NAME1 +"("+ INFO_ID
+" INTEGER primary key autoincrement," + " "+ GROUP_TYPE +" text ," + " "
+ INFO_TITLE + " text ," + " "+ INFO_CONTENT + " text)";
db.execSQL(infoSql);
/*创建类别表*/
String groupSql="CREATE TABLE "+ TABLE_NAME2 +"("+ GROUP_ID
+" INTEGER primary key autoincrement, " + "  "+ GROUP_TYPES +" text)";
db.execSQL(groupSql);
Cursor c1 = db.query("info_table", null, null,
null, null, null, null);
if(c1.getCount()>0)
{
    if(db.isOpen())
    db.close();
}
}
以上是我的创建数据库方法
如果还不行的话把你的日志信息发上来,咱们研究一下






首先我必须道谢,谢谢朋友的热情!
我们用的不一样的方法,我用的ContentProvider来实现的。

private static class DatabaseHelper extends SQLiteOpenHelper {

public DatabaseHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}

@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("CREATE TABLE list(_id INTEGER PRIMARY KEY,"
   + "num TEXT," + "area TEXT," + "t TEXT);");
}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
Log.w(TAG, "Upgrating database from version" + oldVersion + "to " +
newVersion + ",which will destory all old data");
db.execSQL("DROP TABLE IF EXISTS list");
onCreate(db);
}

}

我是这么写的。
DatabaseHelper 是内部类,外部类是AscriptionsProvider extends ContentProvider 有一些常量:
private static final String TAG = "AscriptionProvider";
private static final String DATABASE_NAME = "ascriptions.db";
private static final int DATABASE_VERSION = 1;

private static HashMap<String, String> ASCRIPTIONS_PROJECTION_MAP;

private static final int ASCRIPTIONS = 1;
private static final int ASCRIPTIONS_ID = 2;
private static final UriMatcher URL_MATCHER;



日志信息是:
10-12 03:13:38.199: ERROR/AndroidRuntime(31621): java.lang.RuntimeException: Unable to start activity ComponentInfo com.scu.sw.oeasy/com.scu.sw.oeasy.DialRecording}: android.database.sqlite.SQLiteException: Can't upgrade read-only database from version 0 to 1: /data/data/com.scu.sw.oeasy/databases/ascriptions.db

10-12 03:13:38.199: ERROR/AndroidRuntime(31621):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2268)

10-12 03:13:38.199: ERROR/AndroidRuntime(31621):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2284)

10-12 03:13:38.199: ERROR/AndroidRuntime(31621):     at android.app.ActivityThread.access$1800(ActivityThread.java:112)

10-12 03:13:38.199: ERROR/AndroidRuntime(31621):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1692)

10-12 03:13:38.199: ERROR/AndroidRuntime(31621):     at android.os.Handler.dispatchMessage(Handler.java:99)

10-12 03:13:38.199: ERROR/AndroidRuntime(31621):     at android.os.Looper.loop(Looper.java:123)

10-12 03:13:38.199: ERROR/AndroidRuntime(31621):     at android.app.ActivityThread.main(ActivityThread.java:3948)

10-12 03:13:38.199: ERROR/AndroidRuntime(31621):     at java.lang.reflect.Method.invokeNative(Native Method)

10-12 03:13:38.199: ERROR/AndroidRuntime(31621):     at java.lang.reflect.Method.invoke(Method.java:521)

10-12 03:13:38.199: ERROR/AndroidRuntime(31621):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:782)

10-12 03:13:38.199: ERROR/AndroidRuntime(31621):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:540)

10-12 03:13:38.199: ERROR/AndroidRuntime(31621):     at dalvik.system.NativeStart.main(Native Method)

10-12 03:13:38.199: ERROR/AndroidRuntime(31621): Caused by: android.database.sqlite.SQLiteException: Can't upgrade read-only database from version 0 to 1: /data/data/com.scu.sw.oeasy/databases/ascriptions.db

10-12 03:13:38.199: ERROR/AndroidRuntime(31621):     at android.database.sqlite.SQLiteOpenHelper.getReadableDatabase(SQLiteOpenHelper.java:170)

10-12 03:13:38.199: ERROR/AndroidRuntime(31621):     at com.scu.sw.oeasy.AscriptionsProvider.query(AscriptionsProvider.java:171)

10-12 03:13:38.199: ERROR/AndroidRuntime(31621):     at android.content.ContentProvider$Transport.query(ContentProvider.java:129)

10-12 03:13:38.199: ERROR/AndroidRuntime(31621):     at android.content.ContentResolver.query(ContentResolver.java:149)

10-12 03:13:38.199: ERROR/AndroidRuntime(31621):     at com.scu.sw.oeasy.DialRecording.findNumberAscription(DialRecording.java:131)

10-12 03:13:38.199: ERROR/AndroidRuntime(31621):     at com.scu.sw.oeasy.DialRecording.listDialRecord(DialRecording.java:114)

10-12 03:13:38.199: ERROR/AndroidRuntime(31621):     at com.scu.sw.oeasy.DialRecording.onCreate(DialRecording.java:23)

10-12 03:13:38.199: ERROR/AndroidRuntime(31621):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1123)

10-12 03:13:38.199: ERROR/AndroidRuntime(31621):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2231)

10-12 03:13:38.199: ERROR/AndroidRuntime(31621):     ... 11 more


先去吃饭吧,朋友!
6 楼 xihuan&java 2010-10-12  
woshayawo 写道
xihuan&java 写道
woshayawo 写道
xihuan&java 写道
 
woshayawo 写道
你好,请问如果是这种错误,数据库应该如何打开呢,我的也是类似的报错:can't upgrade read-only database from version 0 to 1


你可以通过下面的命令查看你是否创建了表
在Linux下查看数据库文件
1.cmd>adb shell
2.cd data/data
3.ls查看文件
4.进入要查看数据库的项目名
5.ls
6.cd databases
7.ls
8.sqlite3 “数据库名”
9.  .tables


你好,首先非常感谢你能够在百忙之中给予回复,我创建了表,在SQLite客户端也能够正常执行,我是在客户端创建的数据库和表,并插入了表数据,但我在运行写的android程序时却报这种错误,是不是还要有个步骤打开数据库啊,我ContentProvider写的也没问题。


在创建数据库类onCreate(SQLiteDatabase db)方法里你把数据库关闭了吗?




没有,我方法如下:
public void onCreate(SQLiteDatabase db) {
db.execSQL("CREATE TABLE list(_id INTEGER PRIMARY KEY,"
   + "num TEXT," + "area TEXT," + "t TEXT);");
}

就没有了,没有关闭数据库的操作。希望能得到你的指点!




数据库版本:DATABASE_VERSION=1;
//数据库构造方法
public ToDoDB(Context context)
{
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
//创建数据库方法
public void onCreate(SQLiteDatabase db) {
/*创建表info*/
String infoSql="CREATE TABLE "+ TABLE_NAME1 +"("+ INFO_ID
+" INTEGER primary key autoincrement," + " "+ GROUP_TYPE +" text ," + " "
+ INFO_TITLE + " text ," + " "+ INFO_CONTENT + " text)";
db.execSQL(infoSql);
/*创建类别表*/
String groupSql="CREATE TABLE "+ TABLE_NAME2 +"("+ GROUP_ID
+" INTEGER primary key autoincrement, " + "  "+ GROUP_TYPES +" text)";
db.execSQL(groupSql);
Cursor c1 = db.query("info_table", null, null,
null, null, null, null);
if(c1.getCount()>0)
{
    if(db.isOpen())
    db.close();
}
}
以上是我的创建数据库方法
如果还不行的话把你的日志信息发上来,咱们研究一下
5 楼 woshayawo 2010-10-12  
xihuan&java 写道
woshayawo 写道
xihuan&java 写道
 
woshayawo 写道
你好,请问如果是这种错误,数据库应该如何打开呢,我的也是类似的报错:can't upgrade read-only database from version 0 to 1


你可以通过下面的命令查看你是否创建了表
在Linux下查看数据库文件
1.cmd>adb shell
2.cd data/data
3.ls查看文件
4.进入要查看数据库的项目名
5.ls
6.cd databases
7.ls
8.sqlite3 “数据库名”
9.  .tables


你好,首先非常感谢你能够在百忙之中给予回复,我创建了表,在SQLite客户端也能够正常执行,我是在客户端创建的数据库和表,并插入了表数据,但我在运行写的android程序时却报这种错误,是不是还要有个步骤打开数据库啊,我ContentProvider写的也没问题。


在创建数据库类onCreate(SQLiteDatabase db)方法里你把数据库关闭了吗?




没有,我方法如下:
public void onCreate(SQLiteDatabase db) {
db.execSQL("CREATE TABLE list(_id INTEGER PRIMARY KEY,"
   + "num TEXT," + "area TEXT," + "t TEXT);");
}

就没有了,没有关闭数据库的操作。希望能得到你的指点!


4 楼 xihuan&java 2010-10-12  
woshayawo 写道
xihuan&java 写道
 
woshayawo 写道
你好,请问如果是这种错误,数据库应该如何打开呢,我的也是类似的报错:can't upgrade read-only database from version 0 to 1


你可以通过下面的命令查看你是否创建了表
在Linux下查看数据库文件
1.cmd>adb shell
2.cd data/data
3.ls查看文件
4.进入要查看数据库的项目名
5.ls
6.cd databases
7.ls
8.sqlite3 “数据库名”
9.  .tables


你好,首先非常感谢你能够在百忙之中给予回复,我创建了表,在SQLite客户端也能够正常执行,我是在客户端创建的数据库和表,并插入了表数据,但我在运行写的android程序时却报这种错误,是不是还要有个步骤打开数据库啊,我ContentProvider写的也没问题。


在创建数据库类onCreate(SQLiteDatabase db)方法里你把数据库关闭了吗?
3 楼 woshayawo 2010-10-12  
xihuan&java 写道
 
woshayawo 写道
你好,请问如果是这种错误,数据库应该如何打开呢,我的也是类似的报错:can't upgrade read-only database from version 0 to 1


你可以通过下面的命令查看你是否创建了表
在Linux下查看数据库文件
1.cmd>adb shell
2.cd data/data
3.ls查看文件
4.进入要查看数据库的项目名
5.ls
6.cd databases
7.ls
8.sqlite3 “数据库名”
9.  .tables


你好,首先非常感谢你能够在百忙之中给予回复,我创建了表,在SQLite客户端也能够正常执行,我是在客户端创建的数据库和表,并插入了表数据,但我在运行写的android程序时却报这种错误,是不是还要有个步骤打开数据库啊,我ContentProvider写的也没问题。
2 楼 xihuan&java 2010-10-12  
 
woshayawo 写道
你好,请问如果是这种错误,数据库应该如何打开呢,我的也是类似的报错:can't upgrade read-only database from version 0 to 1


你可以通过下面的命令查看你是否创建了表
在Linux下查看数据库文件
1.cmd>adb shell
2.cd data/data
3.ls查看文件
4.进入要查看数据库的项目名
5.ls
6.cd databases
7.ls
8.sqlite3 “数据库名”
9.  .tables

1 楼 woshayawo 2010-10-12  
你好,请问如果是这种错误,数据库应该如何打开呢,我的也是类似的报错:can't upgrade read-only database from version 0 to 1

相关推荐

Global site tag (gtag.js) - Google Analytics