2009-03-29 18 views
9

En un official sqlite3 web page está escrito que debería pensar en sqlite como un reemplazo de la función fopen().Sqlite como reemplazo de fopen()?

¿Qué opina sobre eso? ¿Es siempre una buena solución rellenar el almacenamiento interno de datos de la aplicación con sqlite? ¿Cuáles son las ventajas y desventajas de tal solución?

¿Tienes algo de experiencia en él?

EDITAR: ¿Qué tal su experiencia? ¿Es fácil de usar? ¿Fue doloroso o más bien alegre? ¿Te gusta?

Respuesta

9

Depende. Existen algunas contraindicaciones:

  • para los archivos de configuración, uso de texto plano o XML es mucho más fácil de depurar o para alterar de utilizar una base de datos relacional, incluso uno tan ligero como SQLite.

  • estructuras de árbol son más fáciles de describir utilizando (por ejemplo) mediante el uso de XML de tablas relacionales

  • la API de SQLite está bastante mal documentado - no hay suficientes ejemplos, y el hiperenlaces es pobre. OTOH, la información está allí si te interesa excavar.

  • uso de formatos binarios específicas de la aplicación directa será más rápido que el almacenamiento mismo formato que un BLOB en una base de datos

  • la corrupción de base de datos puede significar la LOS de todos sus datos en lugar de que en un solo mal presentar

otoh, si los datos interna encaja bien con el modelo relacional y si hay un mucho de él, se lo recomiendo SQLite - yo lo uso yo para uno de mis proyectos.

En cuanto a la experiencia, la uso, funciona bien y es fácil de integrar con el código existente. Si la documentación fuera más fácil de navegar, le daría 5 estrellas, ya que le daría cuatro.

+5

¿Está mal documentado? Creo que es realmente bueno en comparación con otros proyectos de FOSS. Enumeran las condiciones previas y posteriores para todo, y no he tenido problemas para entender la API, con una excepción. (Una de sus postcondiciones tiene una pequeña y agradable nota "todo" que necesitan para determinar qué hace) – jalf

+0

Acerca de la corrupción de la base de datos, podría simplemente dividir sus datos en bases de datos separadas. La corrupción de sus propios archivos sería igual de mala y más probable que suceda. Las bases de datos están diseñadas para ser robustas y mantenerse consistentes, después de todo. Pero estoy de acuerdo con su punto general. – jalf

+1

@jalf casi no hay ejemplos, el pecado cardinal para mí en lo que respecta a la documentación. También el enlace de hipertexto es extremadamente pobre. –

1

La atomicidad de SQLite es un plus. Sabiendo que si escribe a medias datos (tal vez se cuelgue en el medio), eso no dañará su archivo de datos. Normalmente realizo algo similar con los archivos de configuración xml haciendo una copia de seguridad del archivo en una carga exitosa, y cualquier carga fallida futura (que indique corrupción) restaura automáticamente la última copia de seguridad. Por supuesto, no es tan granular ni atómico, pero es suficiente para mis deseos.

+0

Es cierto que prueba la forma "correcta" de hacer una copia de seguridad de un archivo de datos existente y escribir uno nuevo de tal forma que no puedas fallar en ningún momento. –

+0

¿Cuál sería la forma "correcta" en su opinión? – AaronLS

4

Como siempre, depende, no hay "una talla para todos" soluciones

Si necesita almacenar los datos en un archivo independiente y usted puede tomar ventaja de las capacidades de bases de datos relacionales de una base de datos SQL de SQLite es genial.

Si sus datos no son una buena opción para un modelo relacional (datos jerárquicos por ejemplo) o si desea que sus datos sean legibles (archivos de configuración) o si necesita interoperar con otro sistema que SQLite no será muy útil y XML podría ser mejor.

Si, por el contrario, necesita acceder a los datos de múltiples programas o computadoras al mismo tiempo que SQLite no es una elección óptima y necesita un servidor de base de datos "real" (MS SQL, Oracle, MySQL, PosgreSQL ...).

1

Encuentro que es un placer trabajar con SQLite, pero no lo consideraría un reemplazo único para fopen().

Como ejemplo, acabo de escribir una pieza de software que descarga imágenes de un servidor web y las almacena en el caché localmente. Al almacenarlos como archivos individuales, puedo verlos en el Explorador de Windows, lo que ciertamente tiene beneficios. Pero necesito mantener un índice que se correlacione entre una URL y el archivo de imagen para usar la memoria caché. Almacenándolos en una base de datos SQLite, todos se sientan en un pequeño archivo ordenado, y puedo acceder a ellos por URL (seleccione imgdata de caché donde url = 'http://foo.bar.jpg') con poco esfuerzo.

Cuestiones relacionadas