2017-04-17 3 views
0

Ich glaube, ich aus Ideen ausgehen, wie dies zu tun. Ich baue und TODO App mit Registrierung und Login-Funktion. Sobald ein Benutzer angemeldet ist, können neue todos Aufgabe in SQLite erstellen (bis jetzt), später möchte ich todos auch löschen und umbenennen.Schwierige Gemeinsame Vorlieben Wert speichern in Android auf SQLite und Null-Wert gespeichert hat

Das ist meine DB-Klasse mit SQliteHelper.

public class DatabaseHelper extends SQLiteOpenHelper { 


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

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

// User table name 
private static final String TABLE_USER = "user"; 

// User Table Columns names 
private static final String COLUMN_USER_ID = "user_id"; 
private static final String COLUMN_USER_NAME = "user_name"; 
private static final String COLUMN_USER_EMAIL = "user_email"; 
private static final String COLUMN_USER_PASSWORD = "user_password"; 

//Table mToDo task name 
private final static String mTODO = "Todos"; 

//Todos table columns names 
private final static String TASK_ID = "task_Id"; //autoincrement 
private final static String user_Id = "userId"; 
private final static String TITLE = "title"; 
private final static String CONTENT = "content"; 

// create table sql query 
private String CREATE_USER_TABLE = "CREATE TABLE " + TABLE_USER + "(" 
     + COLUMN_USER_ID + " INTEGER PRIMARY KEY AUTOINCREMENT," + 
COLUMN_USER_NAME + " TEXT," 
     + COLUMN_USER_EMAIL + " TEXT," + COLUMN_USER_PASSWORD + " TEXT" + 
")"; 

private String CREATE_mTODO_TABLE = "CREATE TABLE " + mTODO + "(" 
     + TASK_ID + " INTEGER PRIMARY KEY AUTOINCREMENT," + user_Id + " TEXT NOT NULL," 
     + TITLE + " TEXT," + CONTENT + " TEXT" + ")"; 

// drop table sql query 
private String DROP_USER_TABLE = "DROP TABLE IF EXISTS " + TABLE_USER; 

public DatabaseHelper(Context context) { 
    super(context, DATABASE_NAME, null, DATABASE_VERSION); 
//  this.ctx = context; 
} 

@Override 
public void onCreate(SQLiteDatabase db) { 
    db.execSQL(CREATE_USER_TABLE); 
    db.execSQL(CREATE_mTODO_TABLE); 

} 

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

    //Drop User Table if exist 
    db.execSQL(DROP_USER_TABLE); 


    // Create tables again 
    onCreate(db); 

} 

Hinzufügen neuer Task zweiten Tabelle

public void add(ToDo todoTask) { 
    SQLiteDatabase db = this.getWritableDatabase(); 
//  SharedPreferences sp = PreferenceManager 
//    .getDefaultSharedPreferences(ctx); 
//  String d = sp.toString(); 

ContentValues values = new ContentValues(); 
    values.put(TITLE, todoTask.getTitle()); 
    values.put(CONTENT, todoTask.getContent()); 

//  values.put(user_Id,todoTask.getUserID(d)); 


// Inserting Row 
    db.insert(mTODO, null, values); 
    db.close(); 
} 

ToDo.java

public class ToDo { 

private int id; 
private String userID; 
private String title; 
private String content; 

public ToDo(String content, int id, String title, String userID) { 
    this.content = content; 
    this.id = id; 
    this.title = title; 
    this.userID = userID; 
} 

public ToDo(String content, String title, String userID) { 
    this.content = content; 
    this.title = title; 
    this.userID = userID; 
} 

public ToDo() { 
} 

public String getContent() { 
    return content; 
} 

public void setContent(String content) { 
    this.content = content; 
} 

public int getId(String name) { 
    return id; 
} 

public void setId(int id) { 
    this.id = id; 
} 

public String getTitle() { 
    return title; 
} 

public void setTitle(String title) { 
    this.title = title; 
} 

public String getUserID(String userID) { 
    return userID; 
} 

public void setUserID(String userID) { 
    this.userID = userID; 
} 
} 

Add Aktivitätsklasse mit Eingängen und fügt Methode

public class addTask extends AppCompatActivity { 


private EditText titleUser; 
private EditText contentDesc; 
private DatabaseHelper db; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_add_task); 
    Button btnAdd = (Button) findViewById(R.id.addToDo); 
    titleUser = (EditText) findViewById(R.id.titleID); 
    contentDesc = (EditText) findViewById(R.id.contentDescId); 
    db = new DatabaseHelper(this); 
    btnAdd.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
       AddItem(); 
     } 


    }); 

} 



private void AddItem() { 
    ToDo todo = new ToDo(); 
    todo.setTitle(titleUser.getText().toString().trim()); 
    todo.setContent(contentDesc.getText().toString().trim()); 
    db.add(todo); 
    finish(); 
} 

Der aktuelle Benutzer, der angemeldet ist, ich, dass Benutzer-ID Gemeinsame Vorlieben In meiner zweiten Tabelle am Putten habe ich so etwas wie dieser

task_Id user_id title content 
1  null Eat  go to Mc 

User_id null ist hier, und ich weiß nicht, warum

ich so etwas wie dieses

task_Id user_id title content 
1  2 Eat  go to Mc 
wollen

user_id- sollte sein, welche Benutzer-ID das todo

+0

IntelliJ Amiya, da funktioniert nicht, ich teste, dass ich – Lwq

Antwort

1

Angenommen, Sie wissen bereits, wie Sie die Benutzer-ID aus den gemeinsamen Einstellungen speichern und abrufen.

In Ihrer addTask Aktivität hinzufügen:

private String userId; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    ... 
    userId = sharedPreference.getString("USER_ID",null); 
    ... 
} 

im addItem() add:

private void AddItem() { 
    ... 
    todo.setUserId(userId); 
    ... 
} 

im DB add() Verwendung dieses:

public void add(ToDo todoTask) { 
    ... 
    values.put(USERID, todoTask.getUserId()); 
    ... 
} 

OR:

Ein weiterer Ansatz ist es, den Wert direkt aus der DB-Klasse zu erhalten, wenn Sie sicher sind, dass Sie nie Aufgabe für andere Benutzer einfügen werden.

public void add(ToDo todoTask) { 
    SQLiteDatabase db = this.getWritableDatabase(); 
    SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(ctx); 
    String d = sp.toString(); 

    ContentValues values = new ContentValues(); 
    values.put(TITLE, todoTask.getTitle()); 
    values.put(CONTENT, todoTask.getContent()); 
    values.put(user_Id,todoTask.getUserID(d)); 

    db.insert(mTODO, null, values); 
    db.close(); 
} 

und im Konstruktor den Kontext für die weitere Verwendung speichern.

private Context ctx; 

public DatabaseHelper(Context context) { 
    super(context, DATABASE_NAME, null, DATABASE_VERSION); 
    this.ctx = context; 
} 
+0

so kommentierte Es funktioniert danke – Lwq

+0

brauche ich SharedPrerences in meiner Add-Methode und db erklären? – Lwq

+0

Nein, tust du nicht! Meine erste Antwort ist alles, was Sie brauchen, der zweite Teil ist nur, weil ich einige kommentierte Zeilen in Ihrem Code bemerkt habe, aber die Logik außerhalb des db-Controllers hält, ist es meiner Meinung nach eine Best Practice. –

0

Sie erstellen ToDo-Tabelle mit user_id.während statischer String refrenced Benutzer-ID ist: also in der Datenbank bei der Eingabe durch Standard

//Table mToDo task name 
private final static String mTODO = "Todos"; 

//Todos table columns names 
private final static String TASK_ID = "task_Id"; 
private final static String user_Id = "userId"; //<----Wrong Here 
private final static String TITLE = "title"; 
private final static String CONTENT = "content"; 

private String CREATE_mTODO_TABLE = "CREATE TABLE " + mTODO + "(" 
    + TASK_ID + " INTEGER PRIMARY KEY AUTOINCREMENT," + user_Id + " TEXT NOT NULL," 
    + TITLE + " TEXT," + CONTENT + " TEXT" + ")"; 

auch etwas mehr für Sie da ist, einfach null geht, müssen Sie den Benutzer-ID-Wert zum Feld liefern. Unten sind einige Beispiele Vorgehensweise So gehen Sie vor

private static final String TAG = "DB_HANDLER"; 

private static final int DATABASE_VERSION = 15; 
private static final String DATABASE_NAME = "ElmexContactsManager.db"; 

/*-------------------------------------------BIZ_SEGMENT----------------------------------------*/ 
private static final String TABLE_BIZ_SEGMENT = "BizSegment"; 

/*01*/private static final String KEY_LOCAL_BIZ_SEGMENT_ID = "LocalBizSegmentId"; 
/*02*/private static final String KEY_BIZ_SEGMENT_ID = "BizSegmentId"; 
/*03*/private static final String KEY_BIZ_SEGMENT = "BizSegment"; 
/*04*/private static final String KEY_ADDED_ON = "AddedOn"; 
/*05*/private static final String KEY_UPDATED_ON = "UpdatedOn"; 

    /*-------------------------------------------BIZ_SEGMENT----------------------------------------*/ 
    String CREATE_TABLE_BIZ_SEGMENT = "CREATE TABLE " + TABLE_BIZ_SEGMENT + "(" 
    /*01*/ + KEY_LOCAL_BIZ_SEGMENT_ID + " INTEGER PRIMARY KEY AUTOINCREMENT," 
    /*02*/ + KEY_BIZ_SEGMENT_ID + " INTEGER," 
    /*03*/ + KEY_BIZ_SEGMENT + " TEXT," 
    /*04*/ + KEY_ADDED_ON + " TEXT," 
    /*05*/ + KEY_UPDATED_ON + " TEXT" 
      + ")"; 

public ContactDatabaseHandler(Context context) { 
    super(context, DATABASE_NAME, null, DATABASE_VERSION); 
    //3rd argument to be passed is CursorFactory instance 
} 


@Override 
public void onCreate(SQLiteDatabase sqLiteDatabase) { try { 
     sqLiteDatabase.execSQL(CREATE_TABLE_BIZ_SEGMENT); 
     sqLiteDatabase.execSQL(CREATE_TABLE_CONTACT_TYPE); 
     sqLiteDatabase.execSQL(CREATE_TABLE_CONTACT_SOURCE); 
     sqLiteDatabase.execSQL(CREATE_TABLE_CONT_INDUSTRY); 
     sqLiteDatabase.execSQL(CREATE_TABLE_MARKETING_REGION); 
     sqLiteDatabase.execSQL(CREATE_TABLE_MARKETING_REGION_BLOCK); 
     sqLiteDatabase.execSQL(CREATE_TABLE_CONTACT_MASTER); 
     sqLiteDatabase.execSQL(CREATE_TABLE_CONTACT_DET); 
    } catch (SQLException e) { 
     e.printStackTrace(); 
    } 
    Log.d(TAG, "Table Craeted "); 
} 
@Override 
public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) { 
    // Drop older table if existed 
    sqLiteDatabase.execSQL("DROP TABLE IF EXISTS " + TABLE_BIZ_SEGMENT); 
    sqLiteDatabase.execSQL("DROP TABLE IF EXISTS " + TABLE_CONTACT_TYPE); 
    sqLiteDatabase.execSQL("DROP TABLE IF EXISTS " + TABLE_CONTACT_SOURCE); 
    sqLiteDatabase.execSQL("DROP TABLE IF EXISTS " + TABLE_CONT_INDUSTRY); 
    sqLiteDatabase.execSQL("DROP TABLE IF EXISTS " + TABLE_MARKETING_REGION); 
    sqLiteDatabase.execSQL("DROP TABLE IF EXISTS " + TABLE_MARKETING_REGION_BLOCK); 
    sqLiteDatabase.execSQL("DROP TABLE IF EXISTS " + TABLE_CONTACT_MASTER); 
    sqLiteDatabase.execSQL("DROP TABLE IF EXISTS " + TABLE_CONTACT_DET); 
    // Create tables again 
    onCreate(sqLiteDatabase); 
    Log.d(TAG, "Table Udgraded to Version :" + i1); 
} 

/*-------------------------------------------BIZ_SEGMENT----------------------------------------*/ 
public void addBizSegment(BizSegment bizSegment) { 
    SQLiteDatabase sqLiteDatabase = this.getWritableDatabase(); 
    DateFormat df = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"); 
    ContentValues values = new ContentValues(); 
    values.put(KEY_BIZ_SEGMENT_ID, bizSegment.getBizSegmentId()); 
    values.put(KEY_BIZ_SEGMENT, bizSegment.getBizSegment()); 
    values.put(KEY_ADDED_ON, df.format(bizSegment.getAddedOn())); 
    values.put(KEY_UPDATED_ON, df.format(bizSegment.getUpdatedOn())); 
    // Inserting Row 
    sqLiteDatabase.insert(TABLE_BIZ_SEGMENT, null, values); 
    //2nd argument is String containing nullColumnHack 
    sqLiteDatabase.close(); // Closing database connection 
} 

public void updateBizSegment(BizSegment bizSegment) { 
    SQLiteDatabase sqLiteDatabase = this.getWritableDatabase(); 
    DateFormat df = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"); 
    ContentValues values = new ContentValues(); 
    //values.put(KEY_BIZ_SEGMENT_ID, bizSegment.getBizSegmentId()); 
    values.put(KEY_BIZ_SEGMENT, bizSegment.getBizSegment()); 
    values.put(KEY_ADDED_ON, df.format(bizSegment.getAddedOn())); 
    values.put(KEY_UPDATED_ON, df.format(bizSegment.getUpdatedOn())); 
    // Inserting Row 
    sqLiteDatabase.update(TABLE_BIZ_SEGMENT, values, KEY_BIZ_SEGMENT_ID + " = ?", new String[]{String.valueOf(bizSegment.getBizSegmentId())}); 
    //2nd argument is String containing nullColumnHack 
    sqLiteDatabase.close(); // Closing database connection 
} 

public List<BizSegment> getBizSegmentAll() { 
    SQLiteDatabase sqLiteDatabase = this.getWritableDatabase(); 
    List<BizSegment> bizSegmentList = new ArrayList<BizSegment>(); 
    DateFormat df = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"); 
    // Select All Query 
    String selectQuery = "SELECT * FROM " + TABLE_BIZ_SEGMENT; 

    Cursor cursor = sqLiteDatabase.rawQuery(selectQuery, null); 

    if (cursor.moveToFirst()) { 
     do { 
      try { 
       BizSegment bizSegment = new BizSegment(cursor.getInt(0), 
         cursor.getInt(1), 
         cursor.getString(2), 
         df.parse(cursor.getString(3)), 
         df.parse(cursor.getString(4))); 
       bizSegmentList.add(bizSegment); 
      } catch (ParseException e) { 
       e.printStackTrace(); 
      } 

     } while (cursor.moveToNext()); 
    } 
    cursor.close(); 
    sqLiteDatabase.close(); 
    //2nd argument is String containing nullColumnHack 
    return bizSegmentList; 
} 

public void deleteBizSegment(BizSegment bizSegment) { 
    SQLiteDatabase db = this.getWritableDatabase(); 
    db.delete(TABLE_BIZ_SEGMENT, KEY_BIZ_SEGMENT_ID + " = ?", 
      new String[]{String.valueOf(bizSegment.getBizSegmentId())}); 
    db.close(); 
} 

Andere Methode verwendet gemeinsame Präferenz, die für begrenzte Daten geeignet ist. Es bietet keine Beziehungen. Ich verwende dies, um grundlegende benutzerbezogene Daten zu speichern. Nicht für komplizierte/relationale große Daten. Für das ist Sqlite bevorzugt.

public class AppPreference { 

SharedPreferences pref; 
SharedPreferences.Editor edit; 

/** 
* @param clientMaster object to set preference 
* @param context  Context of call 
*/ 
public void putPreference(ClientMaster clientMaster, Context context) { 

    pref = context.getSharedPreferences("AppPreference", Context.MODE_PRIVATE); 
    edit = pref.edit(); 

    edit.putInt("ClientId", clientMaster.getClientId()); 
    edit.putString("FirstName", clientMaster.getFirstName()); 
    edit.putString("LastName", clientMaster.getLastName()); 
    edit.putString("Mobile", clientMaster.getMobile()); 
    edit.putInt("PincodeId", clientMaster.getPincodeId()); 
    edit.putString("Email", clientMaster.getEmail()); 
    edit.putString("Password", clientMaster.getPassword()); 
    edit.putString("MembershipCode", clientMaster.getMembershipCode()); 
    edit.putString("MembershipIssueDate", clientMaster.getMembershipIssueDate().toString()); 
    edit.putString("MembershipExpiryDate", clientMaster.getMembershipExpiryDate().toString()); 
    edit.putString("MemberShipUpdatedOn", clientMaster.getMemberShipUpdatedOn().toString()); 
    edit.putString("MemberShipQRCode", clientMaster.getMemberShipQRCode()); 
    edit.putInt("ReferredByTypeID", clientMaster.getReferredByTypeID()); 
    edit.putInt("ReferredByID", clientMaster.getReferredByID()); 
    //edit.putString("LastPasswordUpdatedOn", clientMaster.getLastPasswordUpdatedOn().toString()); 
    edit.putString("TempMembershipCode", clientMaster.getTempMembershipCode()); 
    edit.putString("AddedOn", clientMaster.getAddedOn().toString()); 
    //edit.putString("UpdatedOn", clientMaster.getUpdatedOn().toString()); 
    edit.putBoolean("Login", true); 
    edit.putBoolean("Skip", false); 
    edit.commit(); 
} 

/** 
* 
* @param appLanguage 
* @param context 
*/ 
public void putLanguagePreference(String appLanguage, Context context) { 

    pref = context.getSharedPreferences("AppPreference", Context.MODE_PRIVATE); 
    edit = pref.edit(); 
    edit.putString("AppLanguage", appLanguage); 
    edit.commit(); 
} 

/** 
* To clear All Object preference & Login False 
* 
* @param context Context call 
*/ 
public void clearPreference(Context context) { 
    pref = context.getSharedPreferences("AppPreference", Context.MODE_PRIVATE); 
    edit = pref.edit(); 

    edit.clear(); 

    edit.putBoolean("Login", false); 
    edit.commit(); 

} 

/** 
* @param InstanceId Instance Id 
* @param context 
*/ 
public void putPreferenceInstance(String InstanceId, Context context) { 

    pref = context.getSharedPreferences("AppPreference", Context.MODE_PRIVATE); 
    edit = pref.edit(); 
    edit.putString("InstanceId", InstanceId); 
    edit.commit(); 
} 

}

+0

Was empfehlen Sie mir zu ändern, ich bin mir nicht sicher, wirklich .. Sorry, ich bin Anfänger – Lwq

+0

Sie müssen die Verwendung und den Unterschied für Shared Preference und SQLite verstehen. Ihr Grund für) in der Benutzer-ID ist die Verwendung von Wrong String-Wert. –

+0

Zum Speichern von Grundwerten Shared Preference ist gut. Aber während der Verwendung von detaillierteren SQL-relationalen Datenbank (Sqlite, die Sie verwendet haben) ist angemessen, wenn es viel große Daten gibt. Mein Code ist verwandt mit SQLite –

Verwandte Themen