sql >> Database teknologi >  >> RDS >> SQLite

Er der nogen metoder, der hjælper med at løse almindelige SQLite-problemer?

Følgende er nogle almindelige værktøjer, som nybegynderen kan finde nyttige. De er designet til at være uspecifikke og fungere på enhver database/tabel.

I øjeblikket er der følgende potentielt nyttige metoder:-

  • getAllRowsFromTable for at hente en markør med alle rækker.
  • logCursorColumns at skrive kolonnerne i en markør til loggen.
  • logCursorData for at skrive markørdata og kolonner til loggen.

Bemærk! Anmodninger/forslag til tilføjelser/ændringer vil helt sikkert blive taget i betragtning.

Derudover er der nogle metoder brugt af ovenstående eller blev brugt til at teste/skabe ovenstående :-

  • getEmptyColumnLessCursor (100 point for en brug af denne metode :) ).
  • getBytedata for at returnere en hex-streng af det givne byte-array (til BLOB-håndtering).
  • convertBytesToHex at konvertere et byte-array til en hex-streng (til BLOB-håndtering).

getAllRowsFromTable

Den tilsigtede brug er at oprette en markør, der efterfølgende skal undersøges af logCursorColumns og logCursorData metoder. Dette bør ikke bruges i en produktions-app (ikke at det ikke kan være det).

Dette har signaturen :-

offentlig statisk markør getAllRowsFromTable( SQLiteDatabase db, String tablename, boolean use_error_checking, String forceRowidAs) 

Hvor:-

  • Den første parameter er SQLite-databasen (påkrævet på grund af den generiske karakter).
  • Den anden parameter er tabelnavnet, som dataene skal hentes fra.
  • Den tredje parameter, hvis sand, vil kontrollere, om tabellen eksisterer, før markøren oprettes, der skriver til loggen, hvis tabellen ikke er i databasen.
  • Den fjerde parameter, hvis den ikke er null, eller hvis en streng med længde> 0, vil skabe en ekstra kolonne, navngivet i henhold til parameteren med indholdet af ROWID'en (beregnet til at hjælpe, når der ikke er angivet et alias for ROWID og dermed ROWID er ikke inkluderet). Hvad er ROWID?

Eksempel på brug:-

 mEventsDBHelper =new EventsDBHelper(this); // Hent alle rækker fra tabellen (dette findes eller burde gøre) Cursor events =CommonSQLiteUtilities.getAllRowsFromTable( mEventsDBHelper.getEventsDB(), EventsDBHelper.TBNAME, CommonSQLiteUtilities.ERROR_CHECKING_ON, null ); // Designet til at være problematisk, dvs. ingen sådan tabel Cursor ooops =CommonSQLiteUtilities.getAllRowsFromTable( mEventsDBHelper.getEventsDB(), "NOTATABLE", CommonSQLiteUtilities.ERROR_CHECKING_ON, "rumplestiltskin" ); 
  • Den anden påkaldelse resulterer i følgende linje i loggen:-

    D/SQLITE_CSU:Tabel NOTATABLE var ikke placeret i SQLite Database Master Table. 
  • En markør vil altid blive returneret, selvom denne markør muligvis ikke har nogen rækker og ingen kolonner (f.eks. i det tilfælde, hvor tabellen ikke var i databasen).

  • Undtagelser fanges og rapporteres, når databasetabellen forespørges (hvis den er). f.eks. angive IS som den 4. parameter (forsøger effektivt at bruge ROWID AS IS , som SQLIte ikke kan lide, vil resultere i noget, der ligner :-

10-09 18:57:52.591 3835-3835/? E/SQLiteLog:(1) nær "IS":syntaksfejl10-09 18:57:52.592 3835-3835/? D/SQLITE_CSU:Undtagelse fundet, men fanget ved forespørgsel i tabelhændelser Meddelelse var:nær "IS":syntaksfejl (kode 1):, under kompilering:SELECT rowid AS IS , * FROM hændelser10-09 18:57:52.592 3835-3835/ ? D/SQLITE_CSU:Stacktrace var:10-09 18:57:52.592 3835-3835/? W/System.err:android.database.sqlite.SQLiteException:nær "IS":syntaksfejl (kode 1):, under kompilering:SELECT rowid AS IS , * FRA events10-09 18:57:52.592 3835-3835/? W/System.err:at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method)10-09 18:57:52.592 3835-3835/? W/System.err:at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:889)10-09 18:57:52.592 3835-3835/? W/System.err:at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:500)10-09 18:57:52.592 3835-3835/? W/System.err:at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:588)10-09 18:57:52.592 3835-3835/? W/System.err:at android.database.sqlite.SQLiteProgram.(SQLiteProgram.java:58)10-09 18:57:52.592 3835-3835/? W/System.err:at android.database.sqlite.SQLiteQuery.(SQLiteQuery.java:37)10-09 18:57:52.592 3835-3835/? W/System.err:at android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:44)10-09 18:57:52.592 3835-3835/? W/System.err:at android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1316)10-09 18:57:52.592 3835-3835/? W/System.err:at android.database.sqlite.SQLiteDatabase.queryWithFactory(SQLiteDatabase.java:1163)10-09 18:57:52.592 3835-3835/? W/System.err:at android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1034)10-09 18:57:52.592 3835-3835/? W/System.err:at android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1202)10-09 18:57:52.592 3835-3835/? W/System.err:at mjt.sqlitedbexamples.CommonSQLiteUtilities.getAllRowsFromTable(CommonSQLiteUtilities.java:97)10-09 18:57:52.592 3835-3835/? W/System.err:at mjt.sqlitedbexamples.MainActivity.onCreate(MainActivity.java:61)10-09 18:57:52.593 3835-3835/? W/System.err:at android.app.Activity.performCreate(Activity.java:5990)10-09 18:57:52.593 3835-3835/? W/System.err:at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1106)10-09 18:57:52.593 3835-3835/? W/System.err:at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2278)10-09 18:57:52.593 3835-3835/? W/System.err:at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2387)10-09 18:57:52.593 3835-3835/? W/System.err:at android.app.ActivityThread.access$800(ActivityThread.java:151)10-09 18:57:52.593 3835-3835/? W/System.err:at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303)10-09 18:57:52.593 3835-3835/? W/System.err:at android.os.Handler.dispatchMessage(Handler.java:102)10-09 18:57:52.593 3835-3835/? W/System.err:at android.os.Looper.loop(Looper.java:135)10-09 18:57:52.593 3835-3835/? W/System.err:at android.app.ActivityThread.main(ActivityThread.java:5254)10-09 18:57:52.593 3835-3835/? W/System.err:at java.lang.reflect.Method.invoke(Native Method)10-09 18:57:52.593 3835-3835/? W/System.err:at java.lang.reflect.Method.invoke(Method.java:372)10-09 18:57:52.593 3835-3835/? W/System.err:at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)10-09 18:57:52.593 3835-3835/? W/System.err:at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698) 
  • Den returnerede markør vil være tom uden rækker eller kolonner.

logCursorColumns

Er beregnet til at blive brugt til at skrive kolonneinformation om en markør (som normalt ville afspejle databasen, især hvis du bruger getAllRowsFromTable ).

Dette har signaturen :-

 public static void logCursorColumns(Cursor csr) 

Hvor :-

  • Den første parameter er en markør (en hvilken som helst markør).

Eksempel på brug:-

Bemærk! I forlængelse af det foregående eksempel.

CommonSQLiteUtilities.logCursorColumns(events); CommonSQLiteUtilities.logCursorColumns(ooops);

Dette vil resultere i output på linje med :-

10-09 18:57:52.593 3835-3835/? D/SQLITE_CSU:logCursorColumns aktiveret. Markøren har følgende 8 kolonner.10-09 18:57:52.593 3835-3835/? D/SQLITE_CSU:Kolonnenavn 1 er _id10-09 18:57:52.593 3835-3835/? D/SQLITE_CSU:Kolonnenavn 2 starter 10-09 18:57:52.593 3835-3835/? D/SQLITE_CSU:Kolonnenavn 3 er starts_timestamp10-09 18:57:52.593 3835-3835/? D/SQLITE_CSU:Kolonnenavn 4 er ends10-09 18:57:52.593 3835-3835/? D/SQLITE_CSU:Kolonnenavn 5 er ends_timestamp10-09 18:57:52.593 3835-3835/? D/SQLITE_CSU:Kolonnenavn 6 er beskrivelse10-09 18:57:52.593 3835-3835/? D/SQLITE_CSU:Kolonnenavn 7 er counter10-09 18:57:52.593 3835-3835/? D/SQLITE_CSU:Kolonnenavn 8 er bytedata10-09 18:57:52.593 3835-3835/? D/SQLITE_CSU:logCursorColumns aktiveret. Markøren har følgende 0 kolonner. 

logCursorData

Dette minder meget om logCursorColumns andet end det giver mere omfattende informations-omklassificeringskolonner, og at det også giver information, der omgraderer de faktiske data, der er gemt i databasen.

Dette har signaturen :-

 offentlig statisk void logCursorData(Cursor csr) 

Hvor :-

  • Den første parameter er en markør (en hvilken som helst markør).

Eksempel på brug:-

Bemærk! I forlængelse af det foregående eksempel.

CommonSQLiteUtilities.logCursorData(events); CommonSQLiteUtilities.logCursorData(ooops);

Dette vil resultere i output på linje med :-

10-09 19:30:31.801 1455-1455/? D/SQLITE_CSU:logCursorData Cursor har 6 rækker med 8 kolonner.10-09 19:30:31.801 1455-1455/? D/SQLITE_CSU:Information for række 1 offset=0 For Column _id Type er INTEGER værdi, da String er 1 værdi, så lang er 1 værdi, da double er 1,0 For Columnstarts Type er INTEGER værdi, da String er 1507537831 værdi, så lang er 1507537831 værdi som double er 1,507537831E9 For Column starts_timestamp Type er INTEGER-værdi, da String er 1507537831783 værdi, så længe er 1507537831783 værdi, da double er 1,507537831783E12 For Column-værdi, som slutter som 0-tal. Type er INTEGER-værdi, da String er 0-værdi, så længe er 0-værdi, da dobbelt er 0,0 For kolonnebeskrivelse Type er STRING-værdi, da String er TESTEVENT 001 bare beskrivelsesværdi, så længe er 0 va lue som dobbelt er 0,0 For kolonnetæller Type er INTEGER-værdi, da String er 0-værdi, så længe er 0-værdi, da dobbelt er 0,0 For Kolonne-bytedata Type er BLOB-værdi, da String er uopnåelig! værdi så længe er uopnåelig! værdi som dobbelt er uopnåelig! værdi som klat er 0000000010-09 19:30:31.802 1455-1455/? D/SQLITE_CSU:Information for række 2 offset=1 For Column _id Type er INTEGER-værdi, da String er 2-værdi, så lang er 2-værdi, som double er 2.0 For kolonnestarter Type er INTEGER-værdi, da String er 1507537831 værdi, så lang er 1507537831 værdi som double er 1,507537831E9 For Column starts_timestamp Typen er INTEGER værdi som String er 1507537831785 værdi så lang er 1507537831785 værdi som double er 1,507537831785E12 For Column value ends som INTEGER værdi som 0 0 er 0. Type er INTEGER-værdi, da String er 0-værdi, så længe er 0-værdi, da double er 0,0 For kolonnebeskrivelse Type er STRING-værdi, da String er TESTEVENT 002-beskrivelse og bytearray-værdi som lon g er 0 værdi, da dobbelt er 0,0 For kolonnetæller Type er INTEGER-værdi, da streng er 0-værdi, så længe er 0-værdi, da dobbelt er 0,0 For kolonnebytedata Type er BLOB-værdi, da streng ikke kan opnås! værdi så længe er uopnåelig! værdi som dobbelt er uopnåelig! værdi som klat er 000102030405060708090010-09 19:30:31.802 1455-1455/? D/SQLITE_CSU:Oplysninger for række 3 offset=2 For Column _id Type er INTEGER værdi, da String er 3 værdi, så lang er 3 værdi som double er 3.0 For Kolonnestarter Type er INTEGER værdi, da String er 1507537831 værdi, så lang er 1507537831 værdi som double er 1,507537831E9 For Column starts_timestamp Type er INTEGER værdi som String er 1507537831789 værdi så lang er 1507537831789 værdi som double er 1,507537831789E12 For Column værdi ender som 507537831789 værdi så lang er 1507537831789 værdi som double er 1,507537831789E12 For Column værdi slutter som 50 ends_timestamp Type er INTEGER-værdi, da String er 0-værdi, så længe er 0-værdi, da double er 0,0 For kolonnebeskrivelse Type er STRING-værdi, da String er TESTEVENT 003 desc, bytes og endint værdi så længe er 0 værdi som dobbelt er 0,0 For kolonnetæller Type er INTEGER værdi som String er 0 værdi så længe er 0 værdi som dobbelt er 0,0 For Column bytedata Type er BLOB værdi da String er uopnåelig! værdi så længe er uopnåelig! værdi som dobbelt er uopnåelig! værdi som klat er 7F7E7D7C10-09 19:30:31.802 1455-1455/? D/SQLITE_CSU:Information for række 4 offset=3 For Column _id Type er INTEGER værdi, da String er 4 værdi så lang er 4 værdi som double er 4.0 For Column starts Type er INTEGER værdi da String er 1507537831 værdi så lang er 1507537831 værdi som double er 1,507537831E9 For Column starts_timestamp Type er INTEGER værdi som String er 1507537831792 værdi så lang er 1507537831792 værdi som double er 1,507537831792E12 For Column værdi ender som INTEGER værdi som 0 0 0. Type er INTEGER-værdi, da String er 0-værdi, så længe er 0-værdi, da double er 0,0 For kolonnebeskrivelse Type er STRING-værdi, da String er TESTEVENT 004 desc, bytes og endlong-værdi så lang er 0 værdi, da dobbelt er 0,0 For kolonnetæller Type er INTEGER-værdi, da String er 0-værdi, så længe er 0-værdi, da dobbelt er 0,0 For Kolonne-bytedata Type er BLOB-værdi, da String er uopnåelig! værdi så længe er uopnåelig! værdi som dobbelt er uopnåelig! værdi som klat er 38424C56606A747E10-09 19:30:31.803 1455-1455/? D/SQLITE_CSU:Information for række 5 offset=4 For kolonne _id Type er INTEGER værdi, da String er 5 værdi, så lang er 5 værdi som dobbelt er 5.0 For kolonnestarter Type er INTEGER værdi, da String er 1507537831 værdi så lang er 1507537831 værdi som Dobbelt er 1.507537831E9 for kolonne Starts_timestamp -type er heltalværdi, da streng er 1507537831794 Værdi, da længe er 1507537831794 Værdi som dobbelt er 1.507537831794E12 for kolonneender er heltal som streng er 1699999999999999999999999999999999999999999999999999999999999999999999 ends_timestamp Typen er INTEGER-værdi, da String er 0-værdi, så længe er 0-værdi, da double er 0,0 For kolonnebeskrivelse Type er STRING-værdi, da String er TESTEVENT 005 desc, endi nt værdi så længe er 0 værdi, da dobbelt er 0,0 For kolonnetæller Type er INTEGER værdi, da streng er 0 værdi, så længe er 0 værdi, da dobbelt er 0,0 For kolonne bytedata Type er BLOB værdi, da streng ikke kan opnås! værdi så længe er uopnåelig! værdi som dobbelt er uopnåelig! værdi som klat er 0000000010-09 19:30:31.803 1455-1455/? D/SQLITE_CSU:Information for række 6 offset=5 For Column _id Type er INTEGER-værdi, da String er 6-værdi, så lang er 6-værdi, som dobbelt er 6,0 For kolonnestarter Type er INTEGER-værdi, da String er 1507537831 værdi, så lang er 1507537831 værdi som double er 1,507537831E9 For Column starts_timestamp Type er INTEGER-værdi, da String er 1507537831796-værdi, så længe er 1507537831796 værdi, da double er 1,507537831796E12 For Column-værdi, som slutter, som INTEGER-værdi, som 0-tal. Type er INTEGER-værdi, da String er 0-værdi, så længe er 0-værdi, da double er 0,0 For kolonnebeskrivelse Type er STRING-værdi, da String er TESTEVENT 006 desc, endlong-værdi, så længe er 0-værdi da dobbelt er 0,0 For kolonnetæller Type er INTEGER-værdi, da String er 0-værdi, så længe er 0-værdi, da dobbelt er 0,0 For Kolonne-bytedata Type er BLOB-værdi, da String er uopnåelig! værdi så længe er uopnåelig! værdi som dobbelt er uopnåelig! værdi som blob er 00000000 

og for den tomme markør (ups) :-

10-09 19:30:31.804 1455-1455/? D/SQLITE_CSU:logCursorData Cursor har 0 rækker med 0 kolonner. 

Koden CommonSQLiteUtilities.java :-

offentlig klasse CommonSQLiteUtilities { public static final boolean ERROR_CHECKING_ON =sand; offentlig statisk endelig boolean ERROR_CHECKING_OFF =falsk; // SQLite MASTER TABLE definitioner static final String SQLITE_MASTER ="sqlite_master"; statisk endelig streng SM_TABLE_TYPE_COLUMN ="type"; statisk endelig streng SM_NAME_COLUMN ="navn"; statisk endelig streng SM_TABLENAME_COLUMN ="tbl_name"; statisk endelig streng SM_ROOTPAGE_COLUMN ="rodside"; statisk endelig streng SM_SQL_COLUMN ="sql"; statisk endelig streng SM_TYPE_TABLE ="tabel"; statisk endelig streng SM_TYPE_INDEX ="indeks"; statisk endelig streng CSU_TAG ="SQLITE_CSU"; private CommonSQLiteUtilities() {} /** * Generisk henter alle rækker fra en SQlite-tabel, * gør det muligt at kontrollere tabellens eksistens og * tillader også, at ROWID'et tilføjes som en leveret streng * * @param db SQLiteDatabasen * @param tabelnavn Navnet på tabellen, hvorfra den returnerede markør * vil blive oprettet fra; * Bemærk! * @param use_error_checking Om man ikke skal forsøge at opdage fejl * i øjeblikket eksisterer bare en tabel ikke, * sand for at slå til, falsk for at slå fra * ERROR_CHECKING_ON =sand * ERROR_CHECKING_OFF =falsk * @param forceRowidAs Hvis længden af ​​den passerede streng er 1 eller større * så vil en kolonne, som et alias for ROWID, blive * tilføjet til markøren * @return den udtrukne markør, eller i tilfælde af * den underliggende tabel ikke eksisterer en tom markør * uden kolonner */ offentlig statisk markør getAllRowsFromTable(SQLiteDatabase db, String tablename, boolean use_error_checking, String forceRowi dAs) { String[] kolonner =null; // Tabelnavn skal være mindst 1 tegn langt, hvis (tabelnavn.length() <1) { Log.d(CSU_TAG,nyt objekt(){}.getClass().getEnclosingMethod().getName() + " afslutter da det angivne tabelnavn er mindre end 1 tegn i længden" ); returner ny MatrixCursor(ny streng[]{}); } // Hvis use_error_checking er sand, skal du kontrollere, at tabellen eksisterer // i sqlite_master-tabellen if (use_error_checking) { Cursor chkcsr =db.query(SQLITE_MASTER,null, SM_TABLE_TYPE_COLUMN + "=? OG " + _C_UMBLE?" ny streng[]{SM_TYPE_TABLE,tabelnavn}, null,null,null ); // Ups tabel er ikke i databasen, så returner en tom // kolonneløs markør, hvis (chkcsr.getCount() <1) { Log.d(CSU_TAG,"Tabel " + tabelnavn + " ikke var placeret i SQLite-databasen Mesterbord." ); // returner tom markør uden kolonner returner ny MatrixCursor(ny streng[]{}); } chkcsr.close(); } // Hvis du fremtvinger et alias af ROWID, så bruger ROWID AS ???, * if(forceRowidAs !=null &&forceRowidAs.length()> 0) { columns =new String[]{"rowid AS " +forceRowidAs,"* "}; } // Returner til sidst markøren, men fælde eventuelle undtagelser prøv { return db.query(tabelnavn, kolonner, null, null, null, null, null); } catch (undtagelse e) { Log.d(CSU_TAG,"Undtagelse fundet, men fanget ved forespørgsel efter tabel " + tabelnavn + " Meddelelsen var:\n" + e.getMessage()); Log.d(CSU_TAG,"Stacktrace var:"); e.printStackTrace(); returner ny MatrixCursor(ny streng[]{}); } } /** * Opret og returner en markør uden rækker og kolonner * Ikke brugt, måske til meget lidt brug. * @param db Sqlite-databasen som markøren skal oprettes i * @return Den tomme markør */ privat statisk markør getEmptyColumnLessCursor(SQLiteDatabase db) { return new MatrixCursor(new String[]{}); } /** * Skriv kolonnenavne i den passerede markør til loggen * @param csr Markøren, der skal inspiceres. */ public static void logCursorColumns(Cursor csr) { Log.d(CSU_TAG, new Object(){}.getClass().getEnclosingMethod().getName() + " fremkaldt. Cursoren har følgende " + Integer.toString(csr) .getColumnCount())+ "kolonner."); int position =0; for (String column:csr.getColumnNames()) { position++; Log.d(CSU_TAG,"Kolonnenavn " + Integer.toString(position) + " er " + kolonne ); } } /** * Skriv indholdet af markøren til loggen * @param csr Markøren, der skal vises i loggen */ public static void logCursorData(Cursor csr) { int columncount =csr.getColumnCount(); int rækketælling =csr.getCount(); int csrpos =csr.getPosition(); //<<>> 4]; hexstr[i * 2 + 1] =hexarray[h &0xF]; } returner ny streng(hexstr); }} 

For at bruge koden skal du blot oprette CommonSQLiteUtilities klasse og kopier koden ovenfor.



  1. Postgres:definere en standardværdi for CAST-fejl?

  2. Sorter efter rækkefølge af værdier i en select-sætning i klausul i mysql

  3. Sådan sletter du kolonne i tabel

  4. Vælg xml-elementværdi i Oracle