簡體   English   中英

Android數據庫應用程序在模擬器上運行良好,但在設備上顯示錯誤

[英]Android database application runs fine on emulator but gives an error on the device

我創建了一個簡單的數據庫Android應用程序。 當我在模擬器上調試或運行我的應用程序時,它可以正常工作(即,它可以讀寫數據庫),但是當我在設備上運行它時,則無法讀取和寫入數據庫。 我想我必須更新我的DatabaseHelper類。 誰能幫幫我... DatabaseHelper.java

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;

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

import com.sush.myapp.data.model.UsersCredentials;

public class DatabaseHelper extends SQLiteOpenHelper {
    // Logcat tag
    //private static final String LOG = "DatabaseHelper";

    // Database Version
    private static final int DATABASE_VERSION = 1;

    // Database Name
    private static final String DATABASE_NAME = "DemoDB.db";

    // Table Names
    private static final String TABLE_USERS = "Users";
    private static final String TABLE_SCORES = "Scores";
    private static final String TABLE_SYNCSTATUS = "SyncStatus";

    // Common column names
    private static final String KEY_ID = "id";
    private static final String KEY_CREATED_AT = "created_at";

    // USERS Table - column names
    private static final String KEY_USERID = "userID";
    private static final String KEY_USERNAME = "userName";
    private static final String KEY_USERPSWD = "userPswd";
    private static final String KEY_FIRSTNAME = "firstName";
    private static final String KEY_LASTNAME = "lastName";
    private static final String KEY_USERTYPE = "userType";

    // SCORES Table - column names
    private static final String KEY_USER_ID = "userID";
    private static final String KEY_GAME_ID = "gameID";
    private static final String KEY_SCORES = "scores";

    // SYNCSTATUS Table - column names
    private static final String KEY_STATRDATE = "startDate";
    private static final String KEY_ENDDATE = "endDate";
    private static final String KEY_STATUS = "status";

    // Table Create Statements
    // USERS table create statement
    private static final String CREATE_TABLE_USERS = "CREATE TABLE IF NOT EXISTS "
            + TABLE_USERS + "(" + KEY_ID + " INTEGER PRIMARY KEY AUTOINCREMENT," + KEY_USERID
            + " TEXT," + KEY_USERNAME + " INTEGER," + KEY_USERPSWD + " TEXT," 
            + KEY_FIRSTNAME + " TEXT," + KEY_LASTNAME + " TEXT," + KEY_USERTYPE + " INTEGER,"
            + KEY_CREATED_AT + " DATETIME" + ")";

    // Tag table create statement
    private static final String CREATE_TABLE_SCORES = "CREATE TABLE IF NOT EXISTS "
            + TABLE_SCORES + "(" + KEY_ID + " INTEGER PRIMARY KEY AUTOINCREMENT," + KEY_USER_ID 
            + " INTEGER," + KEY_GAME_ID + " INTEGER," + KEY_SCORES + " INTEGER," 
            + KEY_CREATED_AT + " DATETIME" + ")";

    // todo_tag table create statement
    private static final String CREATE_TABLE_SYNCSTATUS = "CREATE TABLE IF NOT EXISTS "
            + TABLE_SYNCSTATUS + "(" + KEY_ID + " INTEGER PRIMARY KEY AUTOINCREMENT,"
            + KEY_STATRDATE + " DATETIME," + KEY_ENDDATE + " DATETIME," + KEY_STATUS + " INTEGER,"
            + KEY_CREATED_AT + " DATETIME" + ")";

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

    @Override
    public void onCreate(SQLiteDatabase db) {
        // creating required tables
        db.execSQL(CREATE_TABLE_USERS);
        db.execSQL(CREATE_TABLE_SCORES);
        db.execSQL(CREATE_TABLE_SYNCSTATUS);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        // on upgrade drop older tables
        db.execSQL("DROP TABLE IF EXISTS " + TABLE_USERS);
        db.execSQL("DROP TABLE IF EXISTS " + TABLE_SCORES);
        db.execSQL("DROP TABLE IF EXISTS " + TABLE_SYNCSTATUS);
        // create new tables
        onCreate(db);
    }

    //Validate user for login, Return true if correct username and password else return false.
    public Cursor validateUserLogin(String uname, String pswd)
    {
        SQLiteDatabase db=this.getWritableDatabase();
        String[] whereArgs = new String[]{uname, pswd};
        String query = "SELECT "+KEY_USERID+", "+KEY_USERTYPE+" FROM "+TABLE_USERS+" WHERE "+KEY_USERNAME+" = ? AND "+KEY_USERPSWD+" = ?";
        Cursor cur= db.rawQuery(query, whereArgs);
        //Boolean b = cur.moveToFirst();
        if (cur.moveToFirst() == true)
            //return cur.getInt(cur.getColumnIndex(KEY_USERID));
            return cur;
        else
            return null;
    }

    //To get user full name by passing userID.
    public String getUserFullName(int uID)
    {
        SQLiteDatabase db=this.getWritableDatabase();
        String[] whereArgs = new String[]{Integer.toString(uID)};
        String query = "SELECT "+KEY_FIRSTNAME+" || ' ' || "+KEY_LASTNAME+" AS FullName FROM "+TABLE_USERS+" WHERE "+KEY_USERID+" = ?";
        Cursor cur= db.rawQuery(query, whereArgs);
        int index;
        if (cur.moveToFirst() == true)
        {
            index= cur.getColumnIndex("FullName");
            return cur.getString(index);
        }
        else
            return "";
    }

    //********************** CRUD for Users Table **********************//
    public void insertValues(UsersCredentials uc){
        SQLiteDatabase db= this.getWritableDatabase();
        ContentValues cv=new ContentValues();
        cv.put(KEY_USERID, uc.getUserID());
        cv.put(KEY_USERNAME, uc.getUserName());
        cv.put(KEY_USERPSWD, uc.getUserPassword());
        cv.put(KEY_FIRSTNAME, uc.getUserFirstName());
        cv.put(KEY_LASTNAME, uc.getUserLastName());
        cv.put(KEY_USERTYPE, uc.getUserType());
        cv.put(KEY_CREATED_AT, getDateTime());
        db.insert(TABLE_USERS, null, cv);
    }

    public void deleteRecords() {
        SQLiteDatabase db= this.getWritableDatabase();
        db.execSQL("delete from Users");
    }

    private String getDateTime() {
        SimpleDateFormat dateFormat = new SimpleDateFormat(
                "dd-MM-yyyy HH:mm:ss", Locale.getDefault());
        Date date = new Date();
        return dateFormat.format(date);
    }
}

我在HomeLoginActivity.java調用以下語句來創建數據庫。

@SuppressWarnings("deprecation")
public class HomeLoginActivity extends ActivityGroup {

    Button btnSinup;
    EditText user_ID;
    EditText user_pswd;
    SQLiteDatabase db;
    DatabaseHelper dbh;
    Cursor cur;
    String name;
    Intent intent;
    int uID, uType;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.home_login);
        //statement to Create/Open DB
        db = new DatabaseHelper(this).getWritableDatabase();

        if (android.os.Build.VERSION.SDK_INT > 9) {
            StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
            StrictMode.setThreadPolicy(policy);
        }

        dbh = new DatabaseHelper(getApplicationContext());
        user_ID = (EditText)findViewById(R.id.userID);
        user_pswd = (EditText)findViewById(R.id.userPswd);
        btnSinup =(Button)findViewById(R.id.btnLogin);
        btnSinup.setOnClickListener(new OnClickListener()
        {
            @Override
            public void onClick(View v) {
                if (user_ID.getText().toString().equals(""))
                {
                    Toast.makeText(v.getContext(), "Enter the user ID", Toast.LENGTH_SHORT).show();
                }
                else if (user_pswd.getText().toString().equals(""))
                {
                    Toast.makeText(v.getContext(), "Enter the password", Toast.LENGTH_SHORT).show();
                }
                else
                {
                    try{
                        cur = dbh.validateUserLogin(user_ID.getText().toString(), user_pswd.getText().toString());
                        if(cur != null)
                        {
                            startManagingCursor(cur);
                            if(cur.moveToFirst())
                            {
                                uID = cur.getInt(0);
                                //Toast.makeText(v.getContext(), "uID = "+uID, Toast.LENGTH_SHORT).show();
                                uType = cur.getInt(1);
                                //Toast.makeText(v.getContext(), "uType = "+uType, Toast.LENGTH_SHORT).show();
                                cur.close();
                                name = dbh.getUserFullName(uID);
                                if(uType == 3) //Goto Admin Home
                                {
                                    //Toast.makeText(v.getContext(), "Name = "+name, Toast.LENGTH_SHORT).show();
                                    Intent adminHome = new Intent(v.getContext(), HomeAdminActivity.class);
                                    adminHome.putExtra("ID", uID);
                                    adminHome.putExtra("userFullName", name);
                                    replaceContentView("home_admin", adminHome);
                                }
                                else //Goto Users Home
                                {
                                    //Toast.makeText(v.getContext(), "Name = "+name, Toast.LENGTH_SHORT).show();
                                    Intent userHome = new Intent(v.getContext(), HomeUserActivity.class);
                                    userHome.putExtra("ID", uID);
                                    userHome.putExtra("userFullName", name);
                                    replaceContentView("home_user", userHome);
                                }
                            }
                            else
                            {
                                Toast.makeText(v.getContext(), "User not found", Toast.LENGTH_SHORT).show();
                                cur.close();
                            }
                        }
                        else
                        {
                            Toast.makeText(v.getContext(), "Invalid username or password", Toast.LENGTH_SHORT).show();
                            cur.close();
                        }
                    }catch(Exception e){
                        //cur.close();
                        //Toast.makeText(v.getContext(), "Error = "+e, Toast.LENGTH_SHORT).show();
                    }
                }
            }
        });
    }

    public void replaceContentView(String homeID, Intent homeIntent) {
        View view = getLocalActivityManager().startActivity(homeID,homeIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)) .getDecorView();
        this.setContentView(view);
    }
}

當我在模擬器上運行我的應用程序並嘗試使用數據庫中存在的userDetails登錄時,它可以正常工作並獲得登錄,但是當我將.apk文件復制到設備上並在安裝后運行該應用程序並嘗試登錄時它顯示無效的UserInformation。

切換到DDMS透視圖並檢查db是否在此位置/data/data/YOUR_APP/databases/YOUR_DATABASAE.db

我將您的代碼更改為此:

  public void insertValues(int uid,String uname,int pass,String first,String     last,String type,int date){
    SQLiteDatabase db= this.getWritableDatabase();
    ContentValues cv=new ContentValues();
    cv.put(KEY_USERID, uid);
    cv.put(KEY_USERNAME,uname);
    cv.put(KEY_USERPSWD,pass);
    cv.put(KEY_FIRSTNAME, first);
    cv.put(KEY_LASTNAME, last);
    cv.put(KEY_USERTYPE,type);
    cv.put(KEY_CREATED_AT, date);
    db.insert(TABLE_USERS, null, cv);
}

在HomeloginActivity中,我手動插入了記錄:

dbh.insertValues(101,"mohit",123,"mohit", "mohit","1", 12);

並輸入用戶名:mohit密碼:123

它對我來說效果很好,並且能夠登錄。

上面的代碼中的UsersCredential似乎有問題

我已經找到了解決我問題的方法。 上面的代碼是正確的,並且可以正常工作。
問題:安裝在設備上時,數據庫表中沒有數據。
當我們部署任何具有數據庫和數據的Android應用程序時,那時僅在設備上創建數據庫,最初將沒有數據,因此我們需要從服務器執行一些Insert操作或Synchronization操作以將數據獲取到設備DB

在我的應用中,我正在Sync服務器中的數據,因此在同步之后,它在設備上也可以正常工作。
希望這對Newbies有幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM