Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >Android:数据库插入触发异常"getWritableDatabase递归调用“

Android:数据库插入触发异常"getWritableDatabase递归调用“
EN

Stack Overflow用户
提问于 2012-06-26 09:14:03
回答 1查看 1.9K关注 0票数 0

每当异步任务试图将数据插入SQLite数据库时,我都会遇到以下异常。

java.lang.IllegalStateException:递归调用getWritableDatabase

数据由一个服务产生,该服务运行独立的异步任务来下载、转换并最终插入数据。我不确定我要传递的上下文对象是否正确。请注意我在源代码中添加了的注释。在下面的文章中,我添加了相关的类和函数。如果您需要进一步的信息,请留下评论。

代码语言:javascript
运行
AI代码解释
复制
public class CustomServiceHelper {

    // This method gets called by the activities.
    public static void loadData(Context context) {
        Intent intent = new Intent(context, CustomService.class);
        context.startService(intent);
    } 
}

..。

代码语言:javascript
运行
AI代码解释
复制
public class CustomService extends Service {

    private void startStoringTask(Users users) {
        // Passing the context of the service.
        mStoringTask = new StoringTask(this);
        Object[] params = { users };
        mStoringTask.execute(params);
    }
}

..。

代码语言:javascript
运行
AI代码解释
复制
public class UsersProvider extends ContentProvider {

    @Override
    public boolean onCreate() {
        // Not sure if getContext() is correct.
        mDatabase = new CustomDatabase(getContext());
        return true;
    }

    @Override
    public Uri insert(Uri uri, ContentValues values) {
        switch (URI_MATCHER.match(uri)) {
        case URI_CODE_USERS:
            long id = mDatabase.insertUsers(values);
            // TODO: Not sure about the return value.
            return ContentUris.withAppendedId(uri, id);
        }
        return null;
    }
}

..。

代码语言:javascript
运行
AI代码解释
复制
public class CustomDatabase {

    public class CustomSQLiteOpenHelper extends SQLiteOpenHelper {

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

        @Override
        public void onCreate(SQLiteDatabase database) {
            database.execSQL(TABLE_USERS_CREATE);
        }

        @Override
        public void onUpgrade(SQLiteDatabase database, int oldVersion, int newVersion) {
            throw new UnsupportedOperationException();
        }
    }

    private CustomSQLiteOpenHelper mDatabaseHelper = null;

    public CustomDatabase(Context context) {
        // The context is passed in by the UsersProvider.
        mDatabaseHelper = new CustomSQLiteOpenHelper(context);
    }

    public long insertUsers(ContentValues contentValues) {
        return mDatabaseHelper.getWritableDatabase().insert(
            CustomSQLiteOpenHelper.TABLE_USERS, null, contentValues);
    }
}

..。

代码语言:javascript
运行
AI代码解释
复制
public class StoringTask extends AsyncTask<Object, Void, Boolean> {

    private Context mContext = null;
    public StoringTask(Context context) {
        mContext = context;
    }

    @Override
    protected Boolean doInBackground(Object... params) {
        Users users = (Users)params[0];
        return storeUser(users);
    }

    private boolean storeUsers(Users users) {
        if (users == null) return false;
        // Not sure if calling getContentResolver on this context is correct.
        ContentResolver contentResolver = mContext.getContentResolver();
        Iterator<User> iterator = users.iterator();
        do {
            User user = iterator.next();
            storeUser(contentResolver, user);
        }
        while (iterator.hasNext());
        return true;
    }

    private void storeUser(ContentResolver contentResolver, User user) {
        ContentValues cv = new ContentValues(1);
        cv.put(CustomDatabase.Contract.COLUMN_NAME, user.name);
        contentResolver.insert(UsersProvider.Contract.URI_USERS, cv);
    }
}

当我以调试模式运行应用程序时,我最终会在ThreadPoolExecutor方法的finally块中的框架类runWorker()中结束。

编辑:

下面是完整的异常堆栈跟踪。

代码语言:javascript
运行
AI代码解释
复制
java.lang.RuntimeException: An error occured while executing doInBackground()
android.os.AsyncTask$3.done(AsyncTask.java:200)
java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
java.util.concurrent.FutureTask.setException(FutureTask.java:124)
java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
java.util.concurrent.FutureTask.run(FutureTask.java:137)
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1068)
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:561)
java.lang.Thread.run(Thread.java:1096)
Caused by: java.lang.IllegalStateException: getWritableDatabase called recursively
android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:81)
com.test.users.database.CustomDatabase.insertUsers(CustomDatabase.java:125)
com.test.users.database.CustomDatabase$CustomSQLiteOpenHelper.insertTestData(CustomDatabase.java:85)
com.test.users.database.CustomDatabase$CustomSQLiteOpenHelper.onCreate(CustomDatabase.java:60)
android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:106)
com.test.users.database.CustomDatabase.insertUsers(CustomDatabase.java:125)
com.test.users.contentprovider.UsersProvider.insert(UsersProvider.java:51)
android.content.ContentProvider$Transport.insert(ContentProvider.java:174)
android.content.ContentResolver.insert(ContentResolver.java:587)
com.test.users.tasks.StoringTask.storeFeature(StoringTask.java:82)
com.test.users.tasks.StoringTask.storeResponse(StoringTask.java:58)
com.test.users.tasks.StoringTask.doInBackground(StoringTask.java:32)
com.test.users.tasks.StoringTask.doInBackground(StoringTask.java:1)
android.os.AsyncTask$2.call(AsyncTask.java:185)
java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)

我没有提到调用CustomSQLiteOpenHelper.insertTestData()的方法getWritableDatabase()。我在insertTestData()中调用了方法CustomSQLiteOpenHelper.onCreate()。每当应用程序尚未创建数据库时,每次都会发生崩溃。总之,五比零是完全正确的!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-06-26 10:07:38

java.lang.IllegalStateException:递归调用getWritableDatabase

因此,当您在SQLiteOpenHelper.的onCreateonUpgrade方法中使用getWritableDatabase()getReadableDatabase()时,通常会出现这种情况。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11212576

复制
相关文章
Android:SQLiteOpenHelper类(SQLlite数据库操作)详细解析
当我们完成了对数据库的操作后,记得调用SQLiteDatabase的close()方法释放数据库连接,否则容易出现SQLiteException。
Carson.Ho
2019/02/22
30.9K3
递归调用
一个函数在它的函数体内调用它自身称为递归调用,这种函数称为递归函数。执行递归函数将反复调用其自身,每调用一次就进入新的一层,当最内层的函数执行完毕后,再一层一层地由里到外退出。 递归必须是有推出条件的,如果没有,将会一直递下去,没有归。造成内存溢出崩溃。 先写一个简单的递归函数
用户7272142
2023/10/11
1980
递归调用
Android JNI 调用时的异常处理
可以看到异常的发生和处理基本都需要 Native 和 Java 交互,而对于 Native 自身出了异常,也就是 C/C++ 代码有问题,导致应用崩溃的又是另一回事了。
音视频开发进阶
2019/07/26
1.9K0
Carson带你学Android:SQLlite数据库操作全解析(SQLiteOpenHelper类)
###4.1 具体代码如下: 建议先下载Demo再进行阅读:Carson的Github:DataBase_Demo
Carson.Ho
2022/03/24
9940
Carson带你学Android:SQLlite数据库操作全解析(SQLiteOpenHelper类)
【Android】数据存储(三) 数据库(SQLite)
SQLite 前言 之前介绍过Android中保存数据的两种方式:SharedPreferences和File,这篇介绍另一种存储数据的方式——数据库。 数据库:简单来说可视为电子化的文件柜——存储电子文件的处所,用户可以对文件中的数据运行新增、截取、更新、删除等操作。 想必大家对数据库都不陌生,想当年上数据库课的时候,被那些命令整得不要不要的。 扯远了... 进入正题,在Android开发的过程中,保存数据是难免的。如果数据量较小的时候可用SharedPreferences或File来保存,当数据量较大
Gavin-ZYX
2018/05/18
1.2K0
js 递归调用
最近在做一个复杂表格设计数据格式设置,其中用到了多叉树的原理,所以要用到递归来实现数据格式化。
夜尽天明
2019/11/13
19K0
js 递归调用
[android] 手机卫士黑名单功能(列表展示)
先把要拦截的电话号码保存到数据库中,拦截模式用个字段区分,1 电话拦截,2 短信拦截,3全部拦截
唯一Chat
2019/09/10
6600
[android] 手机卫士黑名单功能(列表展示)
Java递归写法_java递归调用
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
全栈程序员站长
2022/10/02
1.6K0
oracle存储过程递归调用_函数的间接递归调用
注意:递归存储过程一般会用到 output 或 return,两者返回值类型上有一定的区别,output 基本上没有限制,但 return 返回的一般是 int 类型。
全栈程序员站长
2022/11/09
1.4K0
oracle存储过程递归调用_函数的间接递归调用
Android 存储学习之SQLite数据库的基本操作
本节学习SQLite数据库,SQLite是Android内置的一个简单的轻量级的数据库。关于SQLite的简介我这里不做过多的介绍。
DragonKingZhu
2022/05/08
4900
Android 存储学习之SQLite数据库的基本操作
Android | SQLite的使用
构建SQLiteOpenHelper实例后, 再调用他的getReadableDatabase()/getWritableDatabase()方法就能创建数据库了 (数据库文件会存放在/data/data/<package name>/databases/目录下)。 此时重写的onCreate()方法被执行(通常处理创建表的逻辑)。!!!!!!
凌川江雪
2019/06/11
1.6K0
android学习笔记----SQLite数据库
目录一二的增删改查源码地址:https://github.com/liuchenyang0515/CreateDB3
砖业洋__
2023/05/06
1K0
android学习笔记----SQLite数据库
Android SQLite数据库基本操作
程序的最主要的功能在于对数据进行操作,通过对数据进行操作来实现某个功能。而数据库就是很重要的一个方面的,Android中内置了小巧轻便,功能却很强的一个数据库–SQLite数据库。那么就来看一下在Android程序中怎么去操作SQLite数据库来实现一些需求的吧。
指点
2019/01/18
1.2K0
Android SQLite数据库基本操作
递归尾调用优化
尾调用(Tail Call)是函数式编程的一个重要概念,就是指某个函数的最后一步是return调用另一个函数。
wade
2020/04/24
7040
Android sqlite 使用简介
进行Android应用开发时经常会用到数据库。Android系统支持sqlite数据库,在app开发过程中很容易通过SQLiteOpenHelper使用数据库,SQLiteOpenHelper依赖于Context对象,但是基于uiatomator1.0和Java程序等无法获取Context的应用如何使用数据库呢?
霍格沃兹测试开发Muller老师
2022/06/07
5100
Android开发工程师文集-1 小时学会SQLite
大家好,我是 Vic,今天给大家带来Android开发工程师文集-1 小时学会SQLite的概述,希望你们喜欢
达达前端
2019/07/03
4270
利用SQLChiper对Android SQLite数据库加密
利用SQLChiper对Android SQLite数据库加密 前言: 上篇文章讲了Android studio+SQLCipher加密SQLite数据库的几个坑,跳过这几个坑,那么SQLCipher的前提就处理完成,本片文章接着讲如何使用SQLCiper加密数据库。
红目香薰
2022/11/29
9540
Android闹钟开发与展示Demo
  1、首先需要判断要查询的表是否存在,不存在则需要创建,判断表是否存在的方法如下:
JQ实验室
2022/02/09
1.5K0
3个一小时-学会Widget小组件开发,学会各种Drawable,学会SQLite
大家好,我是 Vic,今天给大家带来Android开发工程师文集-1 小时学会Widget小组件开发的概述,希望你们喜欢
达达前端
2022/04/29
5800
点击加载更多

相似问题

递归调用的getWritableDatabase

12

调用递归调用的getWritableDatabase/getReadableDatabase

22

java.lang.IllegalStateException:getWritableDatabase递归调用

21

上下文异常Android getWritableDatabase

16

getWritableDatabase的致命异常

20
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档