Ceci est ma classe DatabaseHelper

public class DatabaseHelper extends SQLiteOpenHelper

    public static final int DATABASE_VERSION = 1;
    public static final String DATABASE_NAME = "MyAccountsDB.db";

    public static final String TABLE_Accounts = "Accounts";

    public static final String COLUMN_AccountID= "AccountID";
    public static final String COLUMN_WebSite= "WebSite";
    public static final String COLUMN_Email= "Email";
    public static final String COLUMN_UserName = "UserName";
    public static final String COLUMN_Password= "Password";


    private static final String TEXT_TYPE = " TEXT";
    private static final String INT_TYPE = " INTEGER";
    private static final String COMMA_SEP = ",";

    private static final String SQL_CREATE_TABLE_Accounts =
            "CREATE TABLE " + TABLE_Accounts +
                    " (" +
                    COLUMN_AccountID + INT_TYPE +" PRIMARY KEY AUTOINCREMENT NOT NULL"+ COMMA_SEP +
                    COLUMN_WebSite + TEXT_TYPE + COMMA_SEP +
                    COLUMN_Email + TEXT_TYPE + COMMA_SEP +
                    COLUMN_UserName + TEXT_TYPE + COMMA_SEP +
                    COLUMN_Password+ TEXT_TYPE + ")";
    public DatabaseHelper(Context context)
    {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }


    @Override
    public void onCreate(SQLiteDatabase db)
    {
        db.execSQL(SQL_CREATE_TABLE_Accounts);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int i, int i1)
    {
        db.execSQL("DROP TABLE IF EXISTS " + TABLE_Accounts);
        onCreate(db);
    }
    public void CreateAccount(Account acc)
    {
        SQLiteDatabase db = getWritableDatabase();

        String insertAccount = "Insert into Accounts (WebSite,Email,UserName,Password) values" +
        "('" + acc.getWebSite() + "','" + acc.geteMail() + "','" + acc.getUserName() + "','" + acc.getPassWord() + "')";
        db.execSQL(insertAccount);
    }

    public ArrayList<Account> getAllAccounts()
    {
        String query = "SELECT AccountID , WebSite FROM Accounts";
        ArrayList<Account> Accounts = new ArrayList<Account>();
        SQLiteDatabase database = getReadableDatabase();//when its called here no problem and load all the accounts the way i want
        Cursor c = database.rawQuery(query, null);
        if (c != null)
        {
            while (c.moveToNext())
            {
                Account acc = new Account();
                acc.setAccountID(c.getInt(0));
                acc.setWebSite(c.getString(1));
                Accounts.add(acc);
            }
        }
        return Accounts;
    }
    public Account getAccountByID(int id)
    {
        Account acc  = new Account();
        String query = "SELECT WebSite , eMail , UserName , Password from Accounts where AccountID = " + id;
        SQLiteDatabase database = getReadableDatabase();//but when i call it here following exception thrown 
        Cursor c = database.rawQuery(query, null);
        if (c != null)
        {
            while (c.moveToFirst())
            {
                acc.setAccountID(c.getInt(0));
                acc.setWebSite(c.getString(1));
                acc.seteMail(c.getString(2));
                acc.setUserName(c.getString(3));
                acc.setPassWord(c.getString(4));
            }
        }
        return acc;
    }

NullPointerException :
Attempt to invoke virtual method 'android.database.sqlite.SQLiteDatabase android.content.Context.openOrCreateDatabase(java.lang.String, int, android.database.sqlite.SQLiteDatabase$CursorFactory, android.database.DatabaseErrorHandler)' on a null object reference

J'ai une autre application avec la même syntaxe de méthodes et de fonctions et elle fonctionne sans problème

-6
Hani Mounla 21 avril 2017 à 00:35

3 réponses

Meilleure réponse

Merci à tous ... j'ai trouvé la réponse ... j'appelais le getAccountById méthode à partir d'un fragment ... donc je dois repasser le Contexte à nouveau

UpdateAccountFragment a = new UpdateAccountFragment(accountID,getActivity());

Et le constructeur de UpdateAccountFragment ressemble à

 public UpdateAccountFragment (int accountID , Context context)
{
    this.context = context;
    this.accountID = accountID;
}
0
OneCricketeer 20 avril 2017 à 22:48

Je pense que vous devez créer l'assistant de base de données différemment.

Par exemple,

public class MainActivity extends Activity {

    private DatabaseHelper db; // Don't initialize here

    @Override
    protected void onCreate(Bundle b) {
        ...
        db = new DatabaseHelper(this); // Do it here
    }
}

Et cela devrait corriger l'erreur actuelle si vous utilisez la même variable db tout au long de l'activité, mais que vous rencontrez toujours d'autres problèmes dans les requêtes SQL qui ne correspondent pas à la définition de votre table.

Vous ne voulez pas non plus utiliser while (c.moveToFirst()) à moins que vous ne vouliez que cette boucle ne se termine jamais.

public Account getAccountByID(int id)
{
    Account acc  = new Account();
    SQLiteDatabase database = getReadableDatabase();

    Cursor c = database.query(TABLE_Accounts, 
            { COLUMN_WebSite , COLUMN_Email , COLUMN_UserName , COLUMN_Password }, 
            COLUMN_AccountID + "=?", 
            { String.valueOf(id) }, 
            null, null, null, null);
        );    

    try {
        if (c != null && c.moveToFirst())
        {
            acc.setAccountID(id);
            acc.setWebSite(c.getString(0));
            acc.seteMail(c.getString(1));
            acc.setUserName(c.getString(2));
            acc.setPassWord(c.getString(3));
        }
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        if (c != null) c.close();
    }
    return acc;
}
0
OneCricketeer 20 avril 2017 à 22:25

Le problème est lié à votre requête:

String query = "SELECT WebSite , eMail , UserName , Password from Accounts where AccountID = " + id;

Vous avez utilisé eMail au lieu de Email. Il n'y a pas de column dans votre table Accounts nommée eMail. Remplacez également from par FROM et la clause where par WHERE.

Modifiez votre Query comme ci-dessous:

String query = "SELECT WebSite , Email , UserName , Password FROM Accounts WHERE AccountID = " + id;

# Créez instance de DatabaseHelper à partir de votre Activity ou Fragment comme ci-dessous:

De l'activité:

public class MainActivity extends AppCompatActivity {

    DatabaseHelper db;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        db = new DatabaseHelper(this); // Context is this

        ...............
        ....................
    }

}

À partir du fragment:

public class UpdateAccountFragment extends Fragment {

    DatabaseHelper db;

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        db = new DatabaseHelper(getActivity()); // Context is getActivity()

        ...............
        ....................
    }
}

J'espère que cela aidera ~

-1
Ferdous Ahamed 21 avril 2017 à 03:51