[Java/Android] SQLiteDatabase kan niet schrijven en lezen

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Workerbee
  • Registratie: Juni 2009
  • Laatst online: 13-05 17:12
Ik ben voor de hobby bezig met een App voor android.
Het lukt mij echter niet om database resultaten in de database te schrijven en er weer uit te halen.
Waar het precies misgaat durf ik niet te zeggen.
Als ik via ADB Shell database commando's uitvoer doet hij het wel. De table is ook aangemaakt.

Main activity
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
package com.equinox.wrinklecleaner;

import com.equinox.wrinkle.database.WrinkleDatabaseAdapter;

import android.app.Activity;
import android.database.Cursor;
import android.os.Bundle;
import android.widget.Toast;

public class MyApp extends Activity {
    private WrinkleDatabaseAdapter dbHelper;
    private Cursor cursor;
    
    
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
       
        dbHelper = new WrinkleDatabaseAdapter(this);
        dbHelper.open();
        
        dbHelper.createUser("test", "Passtest");
        
        String result  = dbHelper.fetchUser();
       
        dbHelper.close();
        Toast toast = Toast.makeText(getApplicationContext(),result,Toast.LENGTH_LONG);
        toast.show();
        
    }
}


DatabaseAdapter
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
package com.equinox.wrinkle.database;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;

public class WrinkleDatabaseHelper extends SQLiteOpenHelper {
    //DB info
    private static final String DATABASE_NAME = "WrinkleData";
    
    private static final int DATABASE_VERSION = 1;
    //DB Creation sql statement
    private static final String DATABASE_CREATE = "create table wrinkle_user (id_user integer primary key autoincrement, username text not null, password text not null);";
    
    public WrinkleDatabaseHelper(Context context){
        //CREATE DB
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }
    
    // Method is called during creation of the database
    @Override
    public void onCreate(SQLiteDatabase database)
    {
        database.execSQL(DATABASE_CREATE);
    }
    // Method is called during an upgrade of the database, e.g. if you increase
    // the database version
    @Override
    public void onUpgrade(SQLiteDatabase database, int oldVersion,
            int newVersion) {
        Log.w(WrinkleDatabaseHelper.class.getName(),
                "Upgrading database from version " + oldVersion + " to "
                        + newVersion + ", which will destroy all old data");
        database.execSQL("DROP TABLE IF EXISTS WrinkleData");
        onCreate(database);
    }
    
    
}


DatabaseHelper
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
package com.equinox.wrinkle.database;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;


public class WrinkleDatabaseAdapter {
    
    // Database fields
    public static final String KEY_ROWID = "id_user";
    public static final String KEY_USER = "username";
    public static final String KEY_PASSWORD = "password";
    private static final String DATABASE_TABLE = "wrinkle_user";
    private Context context;
    private SQLiteDatabase database;
    private WrinkleDatabaseHelper dbHelper;
    
    public WrinkleDatabaseAdapter(Context context)
    {
        this.context = context;
    }
    
    public WrinkleDatabaseAdapter open() throws SQLException{
        dbHelper = new WrinkleDatabaseHelper(context);
        database = dbHelper.getWritableDatabase();
        return this;
    }
    
    public void close()
    {
        dbHelper.close();
    }
    
    
    public long createUser(String user, String password) throws SQLException{
    
        ContentValues initialValues = createContentValues(user,password);
        
    
        long c  = database.insert(DATABASE_TABLE, null, initialValues);
        
        
        //database.insert(DATABASE_TABLE, null, initialValues);
        return c;
    }
    
    public String fetchUser() {
    //  Cursor c = database.query(DATABASE_TABLE, new String[] { KEY_ROWID,
        //      KEY_USER, KEY_PASSWORD}, null, null, null,
        //      null, null);
        
        
        Cursor c = database.query(DATABASE_TABLE, new String[] {"id_user", "username", "password"}, 
                null,null, null, null, null);
        
        
        String result =  "";
        
        int iRow = c.getColumnIndex(KEY_ROWID);
        int iName = c.getColumnIndex(KEY_USER);
        int iPassword = c.getColumnIndex(KEY_PASSWORD);
        
        for(c.moveToFirst(); c.isAfterLast(); c.moveToNext())
        {
            result = result + c.getString(iRow) + " " + c.getString(iName) + " " + c.getString(iPassword) + "\n";
            
        }
        return result;
    }
    
    
    private ContentValues createContentValues(String user, String password) {
        ContentValues values = new ContentValues();
        values.put(KEY_USER, "'"+user+"'");
        values.put(KEY_PASSWORD, "'"+password+"'");
        return values;
    }
    
}


Waar zou het aan kunnen liggen?
Graag een duwtje in de goeie richting. (Ben noob met java)

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 23-05 15:21

NMe

Quia Ego Sic Dico.

Dus je dumpt even 150 regels code en verwacht dat wij voor jou gaan debuggen? Zo werkt het natuurlijk niet, niet in de minste plaats omdat jij de enige bent die alle tools heeft om te kúnnen debuggen. Je geeft ook nergens aan of je nu foutmeldingen krijgt of dat er gewoon geen data komt, of...? Hoe verwacht je dat wij je kunnen helpen als je niet zegt wat eraan schort? Je gaat toch ook niet naar de dokter met de tekst "er is iets mis met me maar ik weet niet wat"? ;)

Dus: geef eens wat meer info. Stap eens door je code heen (breakpoints!) en inspect wat variabelen. Wordt je query wel uitgevoerd? Krijg je daar data uit terug? Komt er een foutmelding terug? Zo nee, staat er een warning in je console?

Ik zal een gok doen zonder verder al je code doorgespit te hebben: ik vermoed dat je je databasebasemodel (oftewel je tabelstructuur) hebt aangepast en daarna het databaseversienummer op 1 hebt laten staan. Dat werkt niet.

[ Voor 64% gewijzigd door NMe op 26-10-2011 11:48 ]

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • Workerbee
  • Registratie: Juni 2009
  • Laatst online: 13-05 17:12
Alle query's lijken te werken geen execptions of dergelijke.
Heb een breakpoint bij elke query en o.a bij de result variable.
Query's lijken goed maar het resultaat blijft leeg.

Database versie opgehoogd:

10-26 10:04:36.483: ERROR/Database(907): Failure 1 (table wrinkle_user already exists) on 0x12e8f8 when preparing 'create table wrinkle_user (id_user integer primary key autoincrement, username text not null, password text not null);'.

[ Voor 8% gewijzigd door Workerbee op 26-10-2011 12:14 ]


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 23-05 15:21

NMe

Quia Ego Sic Dico.

Da's nogal wiedes want je DROP TABLE statement in de onUpgrade verwijdert een andere tabel dan de tabel die je onCreate probeert toe te voegen.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • Workerbee
  • Registratie: Juni 2009
  • Laatst online: 13-05 17:12
Ohja, wat dom zeg.
Aangepast maakte niets uit. Nog steeds alle resultaten leeg

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 23-05 15:21

NMe

Quia Ego Sic Dico.

Heb je daarbij ook de versie weer opgehoogd naar 3? Want hij heeft zojuist een upgrade gedaan die niet voltooid is omdat je de foute tabelnamen gebruikte. Als dat het niet oplost: doe eens een rawQuery in plaats van je select-query en execSQL in plaats van je insert. Dan kun je in elk geval zien of het aan te toolset ligt of aan de (verbinding met) de database.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • Workerbee
  • Registratie: Juni 2009
  • Laatst online: 13-05 17:12
Heb de klasses verplaatst naar een nieuwe project, sql-statements veranderd, code opnieuw uitgevoerd en nog steeds niets. Via de shell krijg ik mijn tabel ook niet meer te zien.

[ Voor 14% gewijzigd door Workerbee op 26-10-2011 14:32 ]


Acties:
  • 0 Henk 'm!

  • arie_papa
  • Registratie: Augustus 2008
  • Laatst online: 20:51

arie_papa

Running on Ubuntu

Create table if not excist?

Statistieken zijn als bikini's: wat ze tonen is erg suggestief, wat ze niet tonen is essentieel


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 23-05 15:21

NMe

Quia Ego Sic Dico.

Hoe lost dat precies het probleem op dat de topicstarter heeft met het niet kunnen vinden van de tabel óf met het niet kunnen insterten/selecten?

Krijg je trouwens een lege cursor terug of null met de code zoals hij was?

[ Voor 3% gewijzigd door NMe op 26-10-2011 16:35 ]

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • Workerbee
  • Registratie: Juni 2009
  • Laatst online: 13-05 17:12
Na 2 dagen stoeien heb ik het opgegeven. Nieuw project gestart met bestaande code en werkende database deze naar mijn wensen ingevuld. Bedankt voor alle moeite!

Acties:
  • 0 Henk 'm!

  • Hydra
  • Registratie: September 2000
  • Laatst online: 20-05 12:47
Het zou kunnen dat je Java app wel de data wegschrijft naar de SQLite maar dat je daarna het proces te snel afsluit (millisecondenwerk) waardoor 't niet netjes weggeschreven wordt. Dat probleem heb ik met HSQL in ieder geval gehad.

https://niels.nu


Acties:
  • 0 Henk 'm!

  • Workerbee
  • Registratie: Juni 2009
  • Laatst online: 13-05 17:12
Ik zie dat hij de tabel wel aangemaakt heeft bij het project. Stond geen data in.
Vond het nogal lastig checken, vertrouwde de ADB shell op één of andere manier ook niet.

Heb het volgende gebruikt om te checken of er data in stond:

Eclipse -> Window -> Show view -> Other -> File Explorer

In file explorer

/data/data/ PROJECT / databases/ jouDB.db

Klik op :Pull a file from the device.
Opslaan en openen met SQLite database Browser. Hier weg kan je gewoon query's uitvoeren en de tabel structuur bekijken.

Hoop dat iemand er wat aan heeft.
Pagina: 1