安卓:在安卓应用中,离线存储JSON数据的最佳方法是什么?

14

我想要开发一个应用程序,在谷歌地图上显示乘客所乘坐的路线号码。为了找到路线号码,我需要有关在JSON文件中定义的路线的一些信息。该应用将离线处理和解析JSON文件,并与应用程序一起安装和卸载。JSON文件包含超过100个路线方向。它看起来像下面的代码。在我的Android项目中,我可以将JSON文件存储在哪个文件夹中?以及存储此类数据的最佳方法是什么?

JSON文件:

{"route_direction":[
   {
     1_ab:{
                     
                    { 
                      stopsName_arrivalTime:{"abc":{"mon-fri":[05:33,06:00,06:30,...],
                                                        "sat":[],
                                                        "son":[]
                                                               }
                                             }, 

                                             
                         stops_loca:{lat:53.337994, long:10.600423} ,

                    },
                    { 
                      stopsName_arrivalTime:{"def":{"mon-fri":[],
                                                        "sat":[],
                                                        "son":[]
                                                         }
                                             }, 

                                             
                         stops_loca:{lat:53.740624, long:10.101322} 

                    },
                    { 
                      stopsName_arrivalTime:{"hgk":{"mon-fri":[],
                                                        "sat":[],
                                                        "son":[]
                                                               }
                                             }, 

                                             
                         stops_loca:{lat:53.644834, long:10.203372} 

                    }



                }

       },

        {1_ba:{
                     
                    { 
                      stopsName_arrivalTime:{"hgk":{"mon-fri":[05:33,06:00,06:30],
                                                        "sat":[],
                                                        "son":[]
                                                               }
                                             }, 

                                             
                         stops_loca:{lat:53.437994, long:10.400423} ,

                    },
                    { 
                      stopsName_arrivalTime:{"def":{"mon-fri":[],
                                                        "sat":[],
                                                        "son":[]
                                                         }
                                             }, 

                                             
                         stops_loca:{lat:53.540624, long:10.601322} 

                    },
                    { 
                      stopsName_arrivalTime:{"abc":{"mon-fri":[],
                                                        "sat":[],
                                                        "son":[]
                                                               }
                                             }, 

                                             
                         stops_loca:{lat:53.244834, long:10.703372} 

                    }


                }

        },........

   ]

}


3
你应该将它转换成一个对象并存储在SQLite数据库中。如果仍希望将其存储为文件,请使用assets文件夹。 - Jorge Campos
@Jorge Campos:我该如何将JSON文件转换为对象? - Mr Asker
看一下这个线程:https://dev59.com/V2025IYBdhLWcg3wUESP 注意到提到GSon的答案是使用谷歌的外部库。 - Jorge Campos
@Jorge,将数据存储在SQLite中有什么好处?我的意思是,在将其转换为对象后,我认为可以直接从那里访问数据,而无需再次存储? - Mr Asker
优点是您可以存储更简洁的数据。这样,如果您需要从该数据获取特定信息,则可以使用 SQL 代码进行操作。从中,您可以使用报表数据等使应用程序更具响应性。但是,当然,只有在考虑应用程序的可扩展性时,如果您的需求仅涉及存储和检索一个简单文件,则资产上的简单文件就可以胜任。 - Jorge Campos
@JorgeCampos:我认为在这个问题上使用sqlite并不是正确的方法。你提供的链接中的帖子似乎也同意我的观点,因为它只处理JSON数据,并没有提到使用SQL。 - IcedDante
3个回答

16

也许您可以使用SharedPreferences来保存它们。您可以通过以下方式存储JSON对象/数组:

将JSON保存到SharedPreferences:

    PreferenceManager.getDefaultSharedPreferences(context).edit()
.putString("theJson",jsonObject.toString()).apply();

获取存储的JSON:

JsonObject jsonObject = PreferenceManager.
getDefaultSharedPreferences(this).getString("theJson","");

你好,我有一个复杂的JSON字符串,我能用sharedPreferences来处理它吗? - Mr Asker
@MrAsker 当然可以,您可以轻松保存复杂或大型数据。如果您选择使用sharedPreferences(如果将json保存为字符串),请注意字符串格式。 希望能有所帮助! - Darko Petkovski
3
如果您需要存储少量数据,请使用共享首选项。参考:Android 存储 - Rohit Reddy Abbadi
在这种情况下,使用 Hawk https://github.com/orhanobut/hawk 要比使用 sharedpreferences 更好。 - smrf

2

0
你可以将任意文件存储在assets文件夹中,这些文件可以与你的应用程序一起打包。

https://developer.android.com/tools/projects/index.html

这是一个空文件夹。您可以使用它来存储原始资产文件。 在此保存的文件将按原样编译为.apk文件,并保留原始文件名。您可以使用URI浏览此目录,并使用AssetManager以字节流形式读取文件,就像使用典型文件系统一样。例如,这是纹理和游戏数据的好位置。 请参阅如何从资产中读取的问题。

2
知道这是一篇旧帖子,但要小心使用此解决方案。不要在资产文件夹中存储任何敏感信息。熟练的用户可以读取(和更改)该文件夹。 - MarcJames

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接