2016-06-05 6 views
-1

Мне нужна помощь. Я исследовал неделю, чтобы решить мою проблему, и никакое решение не найдено для меня.Ошибка приложения при нажатии кнопки

Я уже поставил некоторый код и логически он будет работать.

Моя проблема в том, что я хочу получить информацию из базы данных (SQLite) и сохранить ее в переменной.

Когда я нажимаю кнопку (getLoginInfo), это приведет к сбою приложений. Вот код.

DBHandler.java

package project.asyraf.sar; 

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

public class DBHandler extends SQLiteOpenHelper { 

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

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

@Override 
public void onCreate(SQLiteDatabase db) { 

    String createTableLoginInfo = "CREATE TABLE loginInfo (id INTEGER PRIMARY KEY AUTOINCREMENT, username TEXT, password TEXT, accesslevel TEXT, owner TEXT);"; 
    db.execSQL(createTableLoginInfo); 
    String createTableAdmin = "CREATE TABLE admin (id INTEGER PRIMARY KEY AUTOINCREMENT, adminName TEXT, adminIC);"; 
    db.execSQL(createTableAdmin); 
    String createTableLect = "CREATE TABLE lecturer (id INTEGER PRIMARY KEY AUTOINCREMENT, lecturerName TEXT, lecturerIC);"; 
    db.execSQL(createTableLect); 
    String createTableStud = "CREATE TABLE student (id INTEGER PRIMARY KEY AUTOINCREMENT, studentName TEXT, studentIC);"; 
    db.execSQL(createTableStud); 
    String createTableReminder = "CREATE TABLE reminder (id INTEGER PRIMARY KEY AUTOINCREMENT, subject TEXT, activity TEXT, startDate DATE, endDate DATE, description TEXT, owner TEXT);"; 
    db.execSQL(createTableReminder); 
} 

@Override 
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 

    db.execSQL("DROP TABLE IF EXISTS loginInfo"); 
    db.execSQL("DROP TABLE IF EXISTS admin"); 
    db.execSQL("DROP TABLE IF EXISTS lecturer"); 
    db.execSQL("DROP TABLE IF EXISTS student"); 
    db.execSQL("DROP TABLE IF EXISTS reminder"); 

    onCreate(db); 
} 

protected String owner, accessLevel; 

public void getLoginInfo (String username, String password) 
{ 
    Cursor cursor = this.getReadableDatabase().rawQuery("SELECT * FROM loginInfo WHERE username = ? AND password = ?", new String[] {username, password}); 
    cursor.moveToFirst(); 

    accessLevel = cursor.getString(3); 
    owner = cursor.getString(4); 

    cursor.close(); 
} 

LoginMenu.java

package project.asyraf.sar; 

import android.content.Intent; 
import android.database.Cursor; 
import android.support.v7.app.AlertDialog; 
import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.view.View; 
import android.widget.EditText; 
import android.widget.Toast; 

public class LoginMenu extends AppCompatActivity { 

DBHandler useDB = new DBHandler(this); 

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

public void closeApps (View view){ 
    finish(); 
} 

public void loginTrial (View view) { 

    final EditText getUsername = (EditText) findViewById(R.id.username); 
    final EditText getPassword = (EditText) findViewById(R.id.password); 

    String textUsername, textPassword = ""; 

    textUsername = getUsername.getText().toString(); 
    textPassword = getPassword.getText().toString(); 

    Intent loginSuccessLecturer = new Intent (this, LecturerDashboard.class); 
    Intent loginSuccessStudent = new Intent (this, StudentDashboard.class); 
    Intent loginSuccessAdmin = new Intent (this, AdminDashboard.class); 

    //Cursor getLogin = useDB.getLoginData(textUsername, textPassword); 

    useDB.getLoginInfo(textUsername, textPassword); 

    String owner = ""; 
    String accessLevel = ""; 
    owner = useDB.owner; 
    accessLevel = useDB.accessLevel; 

    StringBuffer buffer = new StringBuffer(); 

    if (textUsername.equals("") || textPassword.equals("")) 
    { 
     Toast.makeText(getApplicationContext(), "Enter Username or Password", Toast.LENGTH_SHORT).show(); 
    } 
    else if (textUsername.equals("admin") && textPassword.equals("admin")) 
    { 
     startActivity(loginSuccessAdmin); 
    } 
    else 
    { 
     if (owner.equals("")) 
     { 
      Toast.makeText(getApplicationContext(), "User do not exist", Toast.LENGTH_SHORT).show(); 
     } 
     else 
     { 
      if (accessLevel.equals("student")) 
      { 
       startActivity(loginSuccessStudent); 
      } 
      else if (accessLevel.equals("lecturer")) 
      { 
       startActivity(loginSuccessLecturer); 
      } 
     } 
    } 

    /* 
    if (owner.equals("")) 
    { 
     Toast.makeText(getApplicationContext(), "No Data", Toast.LENGTH_SHORT).show(); 
    } 
    else 
    { 
     //showMessage("Data",buffer.toString()); 
     if (!owner.equals("") && accessLevel.equals("student")) 
     { 
      startActivity(loginSuccessAdmin); 
     } 
     else 
      Toast.makeText(getApplicationContext(), "Login Error, Please Login Again", Toast.LENGTH_SHORT).show(); 

     if (textUsername.equals(usernameInfo) && textPassword.equals(passwordInfo)) 
     { 
      if (accessInfo.equals("admin")) 
      { 
       //startActivity(loginSuccessAdmin); 
      } 
      else if (accessInfo.equals("student")) 
      { 
       Toast.makeText(getApplicationContext(), "Login to Student", Toast.LENGTH_SHORT).show(); 
       //startActivity(loginSuccessStudent); 
      } 
      else if (accessInfo.equals("lecturer")) 
      { 
       //startActivity(loginSuccessLecturer); 
      } 
      else 
       Toast.makeText(getApplicationContext(), "Access Error, Please Login Again", Toast.LENGTH_SHORT).show(); 
     } 
     else 
     { 
      Toast.makeText(getApplicationContext(), "Login Error, Please Login Again", Toast.LENGTH_SHORT).show(); 
     } 
    }*/ 
} 
} 

журнал ошибок

android.database.CursorIndexOutOfBoundsException: Index 0 requested, with a size of 0       
                at project.asyraf.sar.DBHandler.getLoginInfo(DBHandler.java:144) 
                at project.asyraf.sar.LoginMenu.loginTrial(LoginMenu.java:44) 

DBHandler.java:144 (AccessLevel = cursor.getString (3);)

LoginMenu.jav a: 44 (useDB.getLoginInfo (textUsername, textPassword);)

+2

Вы должны показать журнал ошибок с кодом, чтобы каждый мог его понять. –

+0

Это не ошибка при сбое –

+0

На самом деле в журнале ошибок нет ошибок. Это скорее логическая ошибка. – Asyraf

ответ

0

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

DBHandler useDB; 

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

    useDB = new DBHandler(this); 
} 

Хотя, проблема, кажется, курсор пуст (нет никаких колонок)

индекса 0 запрошенных, с размером 0

В этом случае, вам нужно вручную удалить приложение и повторно запустить, чтобы воссоздать таблицы.


Чтобы написать менее подверженный ошибкам запрос, вы можете попробовать это.

if (cursor != null && cursor.moveToFirst()) { 
    accessLevel = cursor.getString(cursor.getColumnIndex("accessLevel")); 
    owner = cursor.getString(cursor.getColumnIndex("owner")); 
} 

Если вы получаете сообщение об ошибке при попытке доступа к этим переменным или ничего не работает, проверьте, есть ли у вас данные в базе данных.

Sidenote: Я не уверен, что сохранение таких переменных экземпляра - хорошая идея. Вы действительно должны вернуть объект Cursor или User.

+0

Ооо, моя ошибка, я объявляю его защищенным. Я отредактирую свой пост. Сори об этом. Хорошо, я попробую 1-й. – Asyraf

+0

См. Обновленный ответ –

+0

IT WORK !!!!!!! СПАСИБО!!!!!!!! – Asyraf

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