问题描述
进入程序,创建一个RMS实例,在其中写入10条数据(对应的索引是1~10),退出程序,一切正常。再次进入程序,打开之前创建的RMS实例,写入一条数据,RMS实例中,有11条记录,但第十条和第十一条的索引都是10,造成了第十一条对第十条记录的覆盖。到现在为止,我还是没弄明白出错的原因。请各位大侠指点,谢谢!
解决方案
解决方案二:
请问你的“写入”,是修改,还是增加?如果是修改,那么可能索引被占用,或者你修改时候,错误删了一条,被删的记录位置的索引不变,但是内容是null如果是增加,你的覆盖是怎么来的??能看下你的完整代码么??
解决方案三:
不是修改,是增加,写记录的函数如下,就是在打开rms后,调用这个函数写记录。publicstaticvoidwriteRMS(Stringstr,RecordStorers){try{byte[]data=str.getBytes("UTF-8");if(null!=rs){rs.addRecord(data,0,data.length);}}catch(UnsupportedEncodingExceptione){//TODOAuto-generatedcatchblocke.printStackTrace();}catch(RecordStoreNotOpenExceptione){//TODOAuto-generatedcatchblocke.printStackTrace();}catch(RecordStoreFullExceptione){//TODOAuto-generatedcatchblocke.printStackTrace();}catch(RecordStoreExceptione){//TODOAuto-generatedcatchblocke.printStackTrace();}}
解决方案四:
引用2楼kircheis_tree的回复:
不是修改,是增加,写记录的函数如下,就是在打开rms后,调用这个函数写记录。publicstaticvoidwriteRMS(Stringstr,RecordStorers){try{byte[]data=str.getBytes("UTF-8");if(null!=rs){rs.addRecord(data,0,data.leng……
那可能是你读取时候,出问题了,你在按照索引读取记录时,有没创建个新的字符数组?比如byte[]b=rs.getRecord(索引);//返回一个字节数组b,这个b是新的,不能是你上面的data,System.out.println(newString(b));//b要转化为String我觉得如果你没重新创建一个数组来存放你读取的数据,原来data的数组本来还是10个,你读取的索引也只能到10,而你新加进去的不会覆盖data数据。你所谓的覆盖,是数据覆盖吧?数据怎么可能覆盖呢,对象一般才会出现覆盖现象,你这里可能是数组引用对象弄错了。。。。。----PS:本人能想到的只有这么多了,呵呵,也是刚学J2ME,多多指教
解决方案五:
这个和读取没有关系,我写了这样一段测试代码:publicclassRMSextendsMIDlet{RecordStorers=null;rmsCanvascanvas=newrmsCanvas();Displaydisplay;。。。。。。publicRMS(){try{rs=RecordStore.openRecordStore("test",true);byte[]a={1,2,3,4};rs.addRecord(a,0,a.length);byte[]b={5,6,7,8};rs.addRecord(b,0,b.length);}catch(RecordStoreFullExceptione){//TODOAuto-generatedcatchblocke.printStackTrace();}catch(RecordStoreNotFoundExceptione){//TODOAuto-generatedcatchblocke.printStackTrace();}catch(RecordStoreExceptione){//TODOAuto-generatedcatchblocke.printStackTrace();}}publicvoidstartApp(){display=Display.getDisplay(this);display.setCurrent(canvas);canvas.repaint();}}我用的模拟器是KE,第一次运行该程序时,在KE的rmsSonyEricssonK800_240x320.test目录下,会有两个文件:test_1.rms和test_2.rms退出后再次运行程序时,本来应该有test_1.rms,test_2.rms,test_3.rms和test_4.rms四个文件,但事实上只有test_1.rms,test_2.rms,test_3.rms三个文件根据文件内容得知,第一次运行时保存的test_2.rms被覆盖了,所以只有三个文件我看了rs的数据结构,里面有一个vector用来保存记录的索引,test_1.rms的索引是1,test_2.rms和test_3.rms的索引都是2,所以导致了覆盖现在仍然在找原因中,按说RecordStore不会把记录的索引都弄错啊。。。
解决方案六:
记录器.你每一次打开.若打开的名字相同.则打开的是同一个记录器.而不是每执行一次.记录器ID就自增.你的写法.只会将原有的覆盖.因为你根本没有判断记录器里是否存在有记录.代码是没有错.但错的是你思路上的问题.你没有弄清楚RMS的本质.
解决方案七:
操作完成后应该及时关闭rms啊你用close了么
解决方案八:
弄明白了,应该是KE模拟器的问题,因为在真机上一切正常。