正在从程序向数据库添加数据.安卓系统



我遇到了以下情况。在我的程序中,我必须将文件保存在数据库中。这个数据库包含文章的标题,保存文件和文件的路径。所有文件都保存在Assets文件夹中,并且都是手动创建的。但是如果我想从程序本身添加文件呢。例如,创建一个特殊的编辑文本,用户可以在其中编写标题和文章。如何保存这些数据?我知道如何将用户输入的标题添加到数据库中,这很容易。但是那些文章呢。我无法将它们与手动创建的文件一起放置,因为Assets无法保留此类文件。我想将所有完整的文章添加到数据库中,但在这种情况下如何添加资产的文件?

文件(图像、PDF'd.Word文档……(不是结构化数据,存储在数据库中几乎没有什么作用(全文搜索(FTS(是SQLite的扩展,这是另一回事(。

建议的技术是在数据库中存储对文件的一些引用(例如,完整路径或文件名(如果所有文件都存储在文件名可识别的位置((。因此,当您定位/搜索并获得一行时,您可以使用文件本身。

然而,如果文件平均约为100k或更少,那么SQLite实际上可以更快,因此在性能方面,将文件存储在数据库中可能会更好。

  • 注意基于以下链接的100k

比文件系统快35%

您可以将文件存储为BLOB(字节数组(。您将它们读取到字节数组中,并在Android上,假设java,字节数组名为my_byte_array,SQLiteDatabase为db,则:-

ContentValues cv = new Contentvalues();
cv.put("FILE_COLUMN",my_byte_array);
........ other cv.put's for the other columns
long inserted_id = db.insert("The_Table",null,cv);
if (inserted_id < 1) {
.... code to handle row not inserted.
} else {
.... code to handle row inserted OK
} 

警告

大于2M的文件将无法轻松检索,因为光标窗口内存限制为2M。如果应用程序需要向后兼容,即使1M也可能导致问题,并且在某个阶段可能无法使用,因为我认为光标窗口被限制为1M(不确定何时(。

从数据库检索

要从BLOB检索数据,请使用CursorgetBlob(column_offset)方法,或者通常更好地使用CursorgetColumnIndex(column_name)方法根据列名检索列偏移量。因此,如果光标命名为csr,则**my_other_byte_array = csr.getBlob(csr.getColumnIndex(column_name));**

请注意,在使用getBlob方法之前,必须移动到有效行。

最新更新