2017-09-08 1 views
-3

Dans cette chaîne, je mis l'index de Spinner à la base de données:Pourquoi SQLite crée BLOB à partir de mon entier?

values.put(LinkDbHelper.COLUMN_TYPE, spinner.getSelectedItemPosition()); 

Mais quand je vérifie .db sur mon téléphone, je vois blob. Pourquoi BLOB si le type de ce champ est INTEGER NOT NULL DEFAULT?

pleine créer chaîne de table:

"CREATE TABLE " + TABLE_NAME 
      + " (" + BaseColumns._ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " 
      + COLUMN_TYPE + " INTEGER NOT NULL DEFAULT 0, " 
      + COLUMN_NAME + " TEXT NOT NULL, " 
      + COLUMN_LINK + " TEXT NOT NULL, " 
      + COLUMN_IMAGE + " BLOB);" 
+0

Comment faites-vous exactement vérifier le fichier .db? –

Répondre

1

Je crois que vous problème est que de toute façon vous avez réellement stocké un blob dans COLUMN_TYPE.

SQLite est assez flexible, y compris la capacité de stocker tout type de données partout (excpetion ci-dessous) par: -

Toute colonne dans une base de données version SQLite 3, à l'exception d'une ENTIER PRIMAIRE colonne KEY, peut être utilisé pour stocker une valeur de n'importe quelle classe de stockage. Datatypes In SQLite Version 3 - 2. Storage Classes and Datatypes

Je l'ai fait quelques tests et trouver les résultats suivants: -

09-09 15:27:31.347 5114-5114/? D/TBCRT: CREATE TABLE table1(_id INTEGER PRIMARY KEY, type INTEGER NOT NULL DEFAULT 0, alt1 BLOB, name TEXT NOT NULL, link TEXT NOT NULL, image BLOB) 
09-09 15:27:31.365 5114-5114/? D/DBINFO: Row 0 
09-09 15:27:31.366 5114-5114/? D/DBINFO:  
             Column Name=_id Value=1 
             Column Name=type Value=unobtainable 
             Column Name=alt1 Value=unobtainable 
             Column Name=name Value=1504934851322 
             Column Name=link Value=10101111001100101000110110111001011111010 
             Column Name=image Value=2.45678 
             Column Name=TYPE_TYPECOLUMN Value=blob 
             Column Name=TYPE_ALT1COLUMN Value=blob 
             Column Name=TYPE_NAMECOLUMN Value=text 
             Column Name=TYPE_LINKCOLUMN Value=text 
             Column Name=TYPE_IMAGECOLUMN Value=real 
09-09 15:27:31.366 5114-5114/? D/DBINFO: Row 1 
09-09 15:27:31.366 5114-5114/? D/DBINFO:  
             Column Name=_id Value=2 
             Column Name=type Value=-1  
             Column Name=alt1 Value=-1  
             Column Name=name Value=FRED 
             Column Name=link Value=MYLINK  
             Column Name=image Value=unobtainable 
             Column Name=TYPE_TYPECOLUMN Value=integer  
             Column Name=TYPE_ALT1COLUMN Value=integer  
             Column Name=TYPE_NAMECOLUMN Value=text 
             Column Name=TYPE_LINKCOLUMN Value=text 
             Column Name=TYPE_IMAGECOLUMN Value=blob 
09-09 15:27:31.366 5114-5114/? D/DBINFO: Row 2 
09-09 15:27:31.366 5114-5114/? D/DBINFO:  
             Column Name=_id Value=3 
             Column Name=type Value=0 
             Column Name=alt1 Value=100 
             Column Name=name Value=Bert 
             Column Name=link Value=noweher 
             Column Name=image Value=unobtainable 
             Column Name=TYPE_TYPECOLUMN Value=integer  
             Column Name=TYPE_ALT1COLUMN Value=integer  
             Column Name=TYPE_NAMECOLUMN Value=text 
             Column Name=TYPE_LINKCOLUMN Value=text 
             Column Name=TYPE_IMAGECOLUMN Value=blob 
09-09 15:27:31.366 5114-5114/? D/DBINFO: Row 3 
09-09 15:27:31.366 5114-5114/? D/DBINFO:  
             Column Name=_id Value=4 
             Column Name=type Value=unobtainable 
             Column Name=alt1 Value=unobtainable 
             Column Name=name Value=1504934851362 
             Column Name=link Value=10101111001100101000110110111001100100010 
             Column Name=image Value=2.45678 
             Column Name=TYPE_TYPECOLUMN Value=blob 
             Column Name=TYPE_ALT1COLUMN Value=blob 
             Column Name=TYPE_NAMECOLUMN Value=text 
             Column Name=TYPE_LINKCOLUMN Value=text 
             Column Name=TYPE_IMAGECOLUMN Value=real 

Comme la première ligne indique la colonne de type a été créée en utilisant INTEGER NOT NULL DEFAULT 0, le alt1 La colonne a été créée en utilisant BLOB.

La sortie de la ligne 0 indique que la colonne de typea un type de blob, mais pour la ligne 1 montre cependant que le type a un type de entier. La rangée 2 reflète les mêmes types que la rangée 1 et la rangée 3 de la même façon que la rangée 0.

Remarque! la méthode du curseur getString lancera une exception si elle est utilisée pour essayer d'obtenir un blob, donc dans ce cas, la valeur est indiquée comme impossible à obtenir

En bref, vous pouvez voir comment dynamique les types de colonnes sont et que ce que vous spécifiez lorsque vous créez la table n'est pas un disque dur et rapide (type statique).

Pour ce qui précède, j'utilisé ce qui suit dans un DBHelper: -

public class DBHelper extends SQLiteOpenHelper { 

    private static final String DBNNAME = "mydatabase"; 
    private static final int DBVESRION = 1; 
    private static final String TABLENAME = "table1"; 
    private static final String IDCOLUMN = "_id"; 
    private static final String TYPECOLUMN = "type"; 
    private static final String ALT1COLUMN = "alt1"; 
    private static final String NAMECOLUMN = "name"; 
    private static final String LINKCOLUMN = "link"; 
    private static final String IMAGECOLUMN = "image"; 

    DBHelper(Context context) { 
     super(context, DBNNAME, null, DBVESRION); 
    } 


    @Override 
    public void onCreate(SQLiteDatabase db) { 

     String crtsql = "CREATE TABLE " + TABLENAME + "(" + 
       IDCOLUMN + " INTEGER PRIMARY KEY, " + 
       TYPECOLUMN + " INTEGER NOT NULL DEFAULT 0, " + 
       ALT1COLUMN + " BLOB, " + 
       NAMECOLUMN + " TEXT NOT NULL, " + 
       LINKCOLUMN + " TEXT NOT NULL, " + 
       IMAGECOLUMN + " BLOB" + 
       ")"; 
     Log.d("TBCRT",crtsql); 
     db.execSQL(crtsql); 

    } 
    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldversion, int newversion){ 

    } 

..... (plus à venir)

Le code ci-dessus la création de la base de données et la seule table selon : -

CREATE TABLE table1(_id INTEGER PRIMARY KEY, type INTEGER NOT NULL DEFAULT 0, alt1 BLOB, name TEXT NOT NULL, link TEXT NOT NULL, image BLOB)

Le code ci-dessus étant suivi par 3 méthodes: -

insertRow - d'insérer une ligne comme le ferait généralement.

public void insertRow(int type, int alt, String name, String link, byte[] image) { 
    ContentValues cv = new ContentValues(); 
    cv.put(TYPECOLUMN,type); 
    cv.put(ALT1COLUMN,alt); 
    cv.put(NAMECOLUMN,name); 
    cv.put(LINKCOLUMN,link); 
    cv.put(IMAGECOLUMN,image); 

    this.getWritableDatabase().insert(TABLENAME,null,cv); 
} 

insertAlternativeRow pour insérer des lignes avec des types forcés.

public void insertAlternativeRow() { 
    ContentValues cv = new ContentValues(); 
    cv.put(TYPECOLUMN,new byte[]{100,100,100,100,100}); 
    cv.put(ALT1COLUMN,new byte[]{25,25,25,25,25,25,67,45,23,43,17,89,56,34,32,111,21,31,41,51,61,71,81,91, 
      25,25,25,25,25,67,45,23,43,17,89,56,34,32,111,21,31,41,51,61,71,81,91, 
      25,25,25,25,25,67,45,23,43,17,89,56,34,32,111,21,31,41,51,61,71,81,91 
      ,25,25,25,25,25,67,45,23,43,17,89,56,34,32,111,21,31,41,51,61,71,81,91 
      ,25,25,25,25,25,67,45,23,43,17,89,56,34,32,111,21,31,41,51,61,71,81,91 
      ,25,25,25,25,25,67,45,23,43,17,89,56,34,32,111,21,31,41,51,61,71,81,91 
      ,25,25,25,25,25,67,45,23,43,17,89,56,34,32,111,21,31,41,51,61,71,81,91}); 
    cv.put(NAMECOLUMN,Long.toString(System.currentTimeMillis())); 
    cv.put(LINKCOLUMN,Long.toBinaryString(System.currentTimeMillis())); 
    cv.put(IMAGECOLUMN,2.45678d); 
    this.getWritableDatabase().insert(TABLENAME,null,cv); 
} 

viewRowsWithTypes à des lignes de sortie avec le nom de la colonne, la valeur stockée et les types de colonnes que par la fonction typeof.

public Cursor viewRowsWithTypes() { 
    return this.getWritableDatabase().query(TABLENAME, 
      new String[] { 
      "*, " + 
        "typeof(" + TYPECOLUMN + ") AS TYPE_TYPECOLUMN, " + 
        "typeof(" + ALT1COLUMN + ") AS TYPE_ALT1COLUMN, " + 
        "typeof(" + NAMECOLUMN + ") AS TYPE_NAMECOLUMN, " + 
        "typeof(" + LINKCOLUMN + ") AS TYPE_LINKCOLUMN, " + 
        "typeof(" + IMAGECOLUMN + ") AS TYPE_IMAGECOLUMN " 
    }, 
      null,null,null,null,null); 
} 

Dans activty_main.xml Je codé une fileuse de base en lui donnant un identifiant de myspinner.

Dans MainActivity I codé: -

myspinner = (Spinner) findViewById(R.id.myspinner); 
    dbhlpr.insertAlternativeRow(); //Insert a row with forced types 
    dbhlpr.insertRow(myspinner.getSelectedItemPosition(), 
      myspinner.getSelectedItemPosition(), 
      "FRED","MYLINK",new byte[]{0,7,5,4,3,2,8,10,16,32,64,127}); 
    dbhlpr.insertRow(0,100,"Bert","noweher",new byte[]{100,100,100,100,100}); 
    dbhlpr.insertAlternativeRow(); 
    Cursor csr = dbhlpr.viewRowsWithTypes(); 
    String logdata; 
    while (csr.moveToNext()) { 
     Log.d("DBINFO","Row " + csr.getPosition()); 
     logdata = ""; 
     for (int i =0; i < csr.getColumnCount(); i++) { 
      String val; 
      try { 
       val = csr.getString(i); 
      } 
      catch (Exception e) { 
       val = "unobtainable"; 
      } 
      logdata = logdata + "\t\nColumn Name=" + 
        csr.getColumnName(i) + 
        " Value=" + val; 
     } 
     Log.d("DBINFO",logdata); 
    } 
    csr.close(); 

Ainsi, la première ligne (ligne 0) a été inséré en utilisant des types forcés à-dire de manière efficace des données BLOB pour les colonnes de typeet alt1.

La deuxième rangée (rangée 1) a été inséré à l'aide de l'insert typique avec des colonnes de type et alt1 obtenir leurs valeurs par l'intermédiaire de la méthode Spinner getSelectedItemPosition (en notant que le Spinner n'a pas été remplie, par conséquent -1).

La troisième ligne (ligne 2) a été insert, en utilisant à nouveau l'insert typique dans les colonnes de typeet ALT1 étant donné les valeurs directes (0 et 100).

La dernière rangée (rangée 3) était juste une réplique de la première rangée.

Procédé viewRowsWithTypes a ensuite été appelé retour d'un curseur, ce a ensuite été traversé à la sortie de la rangée en cours de traitement, suivie d'une ligne pour chaque colonne avec le nom de colonne, les données dans la colonne (note que getString a été utilisé). Notez que les colonnes TYPE _ ???? contenant une valeur qui reflète la fonction typeof de SQLite (type de colonne) de la colonne ???? (à savoir TYPE_TYPECOLUMN indique le type de la colonne TYPE etc.)