2017-02-09 8 views
0

Так вот код:Android Sqlite - не может вызвать обработчик базы данных за пределами OnCreate

Основная деятельность:

package com.dummies.myapplication; 

import android.database.sqlite.SQLiteDatabase; 
import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.View; 
import android.widget.Button; 
import android.widget.EditText; 

import java.sql.SQLClientInfoException; 
import java.util.List; 
import com.dummies.myapplication.User; 

public class MainActivity extends AppCompatActivity { 

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

     DatabaseHandlerV2 db = new DatabaseHandlerV2(this); 

     // db.deleteTable(); 

//  /db.makeTable(DatabaseHandlerV2); 

     //Log.d("Insert: ", "Inserting .."); 
     db.addUser(new User(1, "name", "email","password","van","username")); 


     // Reading all contacts 
     Log.d("Reading: ", "Reading all contacts.."); 
     List<User> users = db.getAllUsers(); 

     for (User us : users) { 
      String log = "Id: "+us.getID()+" ,Name: " + us.getName() + " ,email: " + us.getEmail() + " ,password: " + us.getPassword() + ",username:" + us.getUsername() + ",van:" + us.getVan(); 
      // Writing Contacts to log 
      Log.d("Name: ", log); 
     } 

     Button login = (Button) findViewById(R.id.loginSubmit); 
     final EditText clientUsername = (EditText)findViewById(R.id.username); 
     final EditText clientPassword = (EditText)findViewById(R.id.password); 

     login.setOnClickListener(new View.OnClickListener(){ 
      public void onClick(View v) { 
       //Log.d("User deets username", clientUsername.getText().toString()); 
       //Log.d("User deets password", clientPassword.getText().toString()); 
       String username = clientUsername.getText().toString(); 
       String password = clientPassword.getText().toString(); 
       LoginHelper LoginHelper = new LoginHelper(); 
       LoginHelper.checkLogin(username, password); 

      } 
     }); 

     //db.deleteTable(); 


    } 
    public void loginSuccess(String id, String username, String email, String password, String vanId, String name) 
    { 
     //Log.d("logged in user", id + "," + username + "," + email + "," + password + "," + vanId); 
     // db.addUser(new User(id, username, email,password,vanId)); 
     int intId = Integer.parseInt(id); 
     //int intVanId = Integer.parseInt(vanId); 
     DatabaseHandlerV2 db = new DatabaseHandlerV2(this); 
     db.deleteTableData(); 
     // db.addUser(new User(intId, name, email,password,vanId,username)); 
     db.addUser(new User(1, "name", "email","password","van","username")); 
     Log.d("Jon Error", "Logged in user is" + intId); 

     // db.deleteTable(); 
    } 


} 

Helper Database V2:

package com.dummies.myapplication; 

/** 
* Created by Jon on 05/02/2017. 
*/ 

import java.util.ArrayList; 
import java.util.List; 

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

public class DatabaseHandlerV2 extends SQLiteOpenHelper { 

    // All Static variables 
    // Database Version 
    private static final int DATABASE_VERSION = 1; 

    // Database Name 
    private static final String DATABASE_NAME = "userManager"; 

    // Contacts table name 
    private static final String TABLE_USERS= "users"; 

    // Contacts Table Columns names 
    private static final String KEY_ID = "id"; 
    private static final String KEY_NAME = "name"; 
    private static final String KEY_EMAIL = "email"; 
    private static final String KEY_PASSWORD = "password"; 
    private static final String KEY_VAN = "van_id"; 
    private static final String KEY_USERNAME = "username"; 


    public DatabaseHandlerV2(Context context) { 
     super(context, DATABASE_NAME, null, DATABASE_VERSION); 
    } 

    // Creating Tables 
    @Override 
    public void onCreate(SQLiteDatabase db) { 
     String CREATE_USERS_TABLE = "CREATE TABLE " + TABLE_USERS + "(" 
       + KEY_ID + " INTEGER PRIMARY KEY," + KEY_NAME + " TEXT," 
       + KEY_EMAIL + " TEXT" + "," + KEY_PASSWORD + " TEXT," + KEY_VAN + " INTEGER," + KEY_USERNAME + " TEXT" + ")"; 

     db.execSQL(CREATE_USERS_TABLE); 
     Log.d("Jon error", "creating table"); 
    } 





    // Upgrading database 
    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
     // Drop older table if existed 
     db.execSQL("DROP TABLE IF EXISTS " + TABLE_USERS); 

     // Create tables again 
     onCreate(db); 
    } 

    /** 
    * All CRUD(Create, Read, Update, Delete) Operations 
    */ 

    // Adding new contact 
    void addUser(User user) { 
     SQLiteDatabase db = this.getWritableDatabase(); 

     //onCreate(db); 

     ContentValues values = new ContentValues(); 
     values.put(KEY_NAME, user.getName()); // Contact Name 
     values.put(KEY_EMAIL, user.getEmail()); // Contact Email 
     values.put(KEY_PASSWORD, user.getPassword()); 
     values.put(KEY_VAN, user.getVan()); 
     values.put(KEY_USERNAME, user.getUsername()); 

     // Inserting Row 
     db.insert(TABLE_USERS, null, values); 
     db.close(); // Closing database connection 

    } 

    // Getting single contact 
    Contact getUser(int id) { 
     SQLiteDatabase db = this.getReadableDatabase(); 

     Cursor cursor = db.query(TABLE_USERS, new String[] { KEY_ID, 
         KEY_NAME, KEY_EMAIL, KEY_PASSWORD, KEY_VAN, KEY_USERNAME }, KEY_ID + "=?", 
       new String[] { String.valueOf(id) }, null, null, null, null); 
     if (cursor != null) 
      cursor.moveToFirst(); 

     Contact contact = new Contact(Integer.parseInt(cursor.getString(0)), 
       cursor.getString(1), cursor.getString(2)); 
     // return contact 
     return contact; 
    } 

    // Getting All Contacts 
    public List<User> getAllUsers() { 
     Log.d("Jon Error", "debug"); 
     List<User> userList = new ArrayList<User>(); 
     // Select All Query 
     String selectQuery = "SELECT * FROM " + TABLE_USERS; 

     SQLiteDatabase db = this.getWritableDatabase(); 
     Cursor cursor = db.rawQuery(selectQuery, null); 

     // looping through all rows and adding to list 
     if (cursor.moveToFirst()) { 
      do { 
       Log.d("Jon Error:", "test"); 
       User user = new User(); 
       user.setID(Integer.parseInt(cursor.getString(0))); 
       //Log.d(cursor.getString(0)); 
       user.setName(cursor.getString(1)); 
       user.setEmail(cursor.getString(2)); 
       user.setPassword(cursor.getString(3)); 
       user.setVan(cursor.getString(4)); 
       user.setUsername(cursor.getString(5)); 
       // Adding contact to list 
       userList.add(user); 
      } while (cursor.moveToNext()); 
     } 

     // return contact list 
     return userList; 
    } 

    // Updating single contact 
    public int updateUser(User user) { 
     SQLiteDatabase db = this.getWritableDatabase(); 

     ContentValues values = new ContentValues(); 
     values.put(KEY_NAME, user.getName()); 
     values.put(KEY_EMAIL, user.getEmail()); 
     values.put(KEY_PASSWORD, user.getPassword()); 
     values.put(KEY_VAN, user.getVan()); 
     values.put(KEY_VAN, user.getUsername()); 

     // updating row 
     return db.update(TABLE_USERS, values, KEY_ID + " = ?", 
       new String[] { String.valueOf(user.getID()) }); 
    } 

    // Deleting single contact 
    public void deleteUser(Contact contact) { 
     SQLiteDatabase db = this.getWritableDatabase(); 
     db.delete(TABLE_USERS, KEY_ID + " = ?", 
       new String[] { String.valueOf(contact.getID()) }); 
     db.close(); 
    } 

    public void deleteTable() 
    { 
     SQLiteDatabase db = this.getReadableDatabase(); 
     db.execSQL("DROP TABLE IF EXISTS " + TABLE_USERS); 
     Log.d("Jon error", "deleteing"); 
    } 

    public void deleteTableData() 
    { 
     SQLiteDatabase db = this.getReadableDatabase(); 
     db.execSQL("DELETE FROM " + TABLE_USERS); 
    } 


    // Getting contacts Count 
    public int getUsersCount() { 
     String countQuery = "SELECT * FROM " + TABLE_USERS; 
     SQLiteDatabase db = this.getReadableDatabase(); 
     Cursor cursor = db.rawQuery(countQuery, null); 
     cursor.close(); 

     // return count 
     return cursor.getCount(); 
    } 

} 

Теперь я уверен, проблема заключается в том, что я вызываю db.addUser (новый пользователь (1, «имя», «электронная почта», «пароль», «фургон», «имя пользователя»)); из метода loginSuccess.

Как я могу заставить эту простую вставку работать? Я уверен, что проблема связана с контекстами. Я пробовал это без везения Static way to get 'Context' on Android?

Спасибо!

+0

Кажется, вы вызываете 'loginSuccess()' из задачи. Ваш контекст равен нулю. При открытии базы данных попробуйте использовать глобальный контекст приложения. – Pztar

ответ

1

Попробуйте использовать одноплодную шаблон дизайна для доступа к данным. Проверьте это post, чтобы посмотреть, как.

Как я вижу, loginSuccess() вызывается после получения данных с веб-сервера.

Возможно, ваше приложение пытается записать данные в базу данных одновременно.

Редактировать: При использовании нескольких экземпляров DatabaseHandlerV2 рассмотрите вопрос о закрытии соединения.

Пример:

Helper:

public class SampleHelper extends SQLiteOpenHelper { 

    private static SampleHelper instance; 
    private static Context mContext; 

    public static synchronized SampleHelper getHelper(Context context) { 
     if (instance == null) 
      instance = new SampleHelper(context); 
     return instance; 
    } 

    private SampleHelper(Context context) { 
     super(context, DATABASE_NAME, null, DATABASE_VERSION); 
     mContext = context; 
    } 
} 

Запись:

SampleHelper helper = SampleHelper.getHelper(mContext); 
SQLiteDatabase writableDb = helper.getWritableDatabase(); 
String statement = "INSERT OR REPLACE INTO table_name(colA,colB) VALUES (valA,valB)"; 
writableDb.execSQL(statement); 

Reading:

Cursor cursor = null; 
try {  
    cursor = SampleHelper.getHelper(mContext).getReadableDatabase().rawQuery("SELECT colA FROM table_name"); 
    if (cursor.moveToFirst()) { 
     do { 
      /**read the data here**/ 
     } while (cursor.moveToNext()); 
    } 
} 
finally { 
    if(null != cursor) 
     cursor.close(); 
} 

Как вы можете заметить, подключение к базе данных не закрывается. При использовании одноэлементного шаблона мы используем только один экземпляр SampleHelper, чтобы мы могли сохранить соединение открытым.

Я не проверял ваш обновленный журнал до сих пор. Он говорит:

A SQLiteConnection object for database '/data/data/com.dummies.myapplication/databases/userManager' was leaked! Please fix your application to end transactions in progress properly and to close the database when it is no longer needed.

Это означает, что ваш не закрывать соединение (db.close();), таким образом, исключения нулевого указателя при выполнении this.getReadableDatabase(); на deleteTableData() метода.

Я по-прежнему рекомендую использовать код примера, предоставляемый во избежание исключения блокировки базы данных.

За openOrCreateDatabase Исключить проверку post. Обратите внимание, что имя базы данных заканчивается .db. Также проверьте, равен ли ваш контекст или нет.

+0

Можете ли вы предоставить конкретный пример? – TEster

+0

Конечно. Так я это делаю. – Goran

+0

Спасибо за это. Тем не менее, я все еще использую свой код erro. - см. обновленный вопрос. – TEster

0

Вы должны открыть доступную для записи базу данных (не читаемую) каждый раз, когда хотите изменить ее структуру. Итак, поместите эту строку: SQLiteDatabase db = this.getWritableDatabase(); вместо этого: SQLiteDatabase db = this.getReadableDatabase(); внутри каждого метода в вашем классе DatabaseHandlerV2, который требует вставки, удаления или обновления данных в db.

В данном конкретном случае, чтобы решить эту ошибку, вы должны изменить метод deleteTableData() таким образом:

public void deleteTableData() 
{ 
    SQLiteDatabase db = this.getWritableDatabase(); 
    db.execSQL("DELETE FROM " + TABLE_USERS); 
} 
+0

У меня все еще есть ошибка: E/AndroidRuntime: FATAL EXCEPTION: main Процесс: com.dummies.myapplication, PID: 3861 java.lang.NullPointerException: попытка вызвать виртуальный метод 'android.database.sqlite.SQLiteDatabase android.content .Context.openOrCreateDatabase (java.lang.String, int, android.database.sqlite.SQLiteDatabase $ CursorFactory, android.database.DatabaseErrorHandler) 'на ссылке нулевого объекта – TEster

+0

Попробуйте поместить весь журнал ошибок в ответ –

+0

Это не означает, t адресует вопрос, и вызов 'getWriteableDatabase()' аналогичен вызову 'getReadableDatabase()' в большинстве случаев. – Pztar

0
DatabaseHandlerV2 maindb=null; 

@Override

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    maindb= new DatabaseHandlerV2(this); 

}

общественного недействительными loginSuccess (String идентификатор, String имя пользователя, String электронной почты, String пароль, String vanId, имя String)

{ maindb .deleteTableData();

 Смежные вопросы

  • Нет связанных вопросов^_^