Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/179.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在android studio中的SQLite数据库中存储视图对象_Java_Android_Sqlite - Fatal编程技术网

Java 如何在android studio中的SQLite数据库中存储视图对象

Java 如何在android studio中的SQLite数据库中存储视图对象,java,android,sqlite,Java,Android,Sqlite,我有一些视图对象,用户可以动态地将其添加到一个布局中,该布局表示如下图所示的地图 唯一的问题是用户需要能够保存数据,所以我想将视图对象存储在SQLite数据库中,然后保存到recyclerView中。当用户单击recyclerView上的项目时,它应该能够加载数据并填充上次保存时的布局 为了序列化视图对象,我尝试对对象进行GSON解析,但由于“StackOverflowerError:AsyncTask中的堆栈大小1036KB…”而无法工作 //将视图对象转换为JSON字符串 类JSONCon

我有一些视图对象,用户可以动态地将其添加到一个布局中,该布局表示如下图所示的地图

唯一的问题是用户需要能够保存数据,所以我想将视图对象存储在SQLite数据库中,然后保存到recyclerView中。当用户单击recyclerView上的项目时,它应该能够加载数据并填充上次保存时的布局

为了序列化视图对象,我尝试对对象进行GSON解析,但由于“StackOverflowerError:AsyncTask中的堆栈大小1036KB…”而无法工作

//将视图对象转换为JSON字符串
类JSONConversion扩展了AsyncTask{
@凌驾
受保护的字符串doInBackground(节点视图…参数){
Gson Gson=新的Gson();
字符串json=gson.toJson(参数[0]);
System.out.println(“DOINBACKGround”+json);
返回json;
}
}
//方法来测试转换是否有效
私有void launchGSON(){
NodeView node=newnodeview(“GAA”,23,this);//测试视图对象
新建JSONTransversion().execute(node);//加载单独的线程和
//将视图对象转换为JSON字符串,如果成功,则应在logcat中显示JSON字符串
}
//自定义视图对象类
公共类NodeView扩展视图{
私有字符串任务;
私人整数时间;
//要在画布上绘制的位图图像
私有瞬态位图mBitmap=BitmapFactory.decodeResource(getResources(),R.drawable.node_图标);
公共节点视图(字符串任务、整数时间、上下文mContext){
超级(mContext);
this.task=任务;
这个时间=时间;
}
@凌驾
公共布尔onTouchEvent(运动事件){
返回true;
}
@凌驾
受保护的void onDraw(画布){
super.onDraw(帆布);
//画布上绘制的位图
}
@凌驾
测量时的保护空隙(内部宽度测量等级、内部高度测量等级){
设定的测量尺寸(150150);
}
}
我开始得出这样的结论:GSON不会处理复杂的对象或太大的对象,那么我是否有什么地方做错了,或者是否有其他方法可以序列化对象状态以存储在SQLite数据库中,然后再检索


谢谢

不要将gson用于大型对象。相反,您的对象应该实现可序列化接口。看这里(好教程):

或者,您可以使用SnappyDb:


对于大型和复杂的对象,它比sqlite更快,并且您可以存储任何pojo对象,而无需使其可序列化。

还请注意,一般来说,在数据库中缓存图像不是一个好主意,除非您有很好的理由这样做。您应该使用文件系统来缓存图像如果我使用的是一个视图对象,其中包含在画布上绘制的位图,我需要一个单独的位图系统吗?
 //Convert view object into JSON string 

 class JSONConversion extends AsyncTask<NodeView, String, String>{


        @Override
        protected String doInBackground(NodeView... params) {

            Gson gson = new Gson();

            String json = gson.toJson(params[0]);

            System.out.println("DOINBACKGround " + json);

            return json;
        }




    }


//method to test whether the conversion worked  

    private void launchGSON(){
        NodeView node = new NodeView("GAA",23,this); //test view object 

        new JSONConversion().execute(node); // load separate thread and 
                                            //convert view object to JSON string, if successful should display the json string in the logcat 


    }



 //Custom View object class 

    public class NodeView extends View {

       private String task; 
       private int time; 


        //bitmap image to be drawn on canvas 
        private transient Bitmap mBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.node_icon); 


        public NodeView(String task, int time, Context mContext) {
super(mContext); 

         this.task = task;
         this.time = time; 



        }



        @Override
        public boolean onTouchEvent(MotionEvent event) {


            return true;

        }

        @Override
        protected void onDraw(Canvas canvas) {
            super.onDraw(canvas);

         //bitmap drawn on canvas 


        }

        @Override
        protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
            setMeasuredDimension(150, 150);
        }




    }