Ormlite Android如何查找插入或更新
我在android应用程序中使用了OSD Ormlite数据库,并使用GSon库解析服务数据。我第一次与服务器同步时遇到问题,我有一个类似地面的模型,模型存储在DB中,服务器端的id字段在模型中重复,类似于相同的id,但模型中有两个对象,当我将这些模型传递给DB(Ormlite)时然后插入一行,当第二次再次与服务器同步时,然后再次执行相同的过程,但当加载项Db时,则异常彻底主键必须是唯一的,我的问题是,如何才能找到模型中的此对象已存在于Db中,现在查询更新或插入 玩家模型Ormlite Android如何查找插入或更新,android,ormlite,foreign-collection,Android,Ormlite,Foreign Collection,我在android应用程序中使用了OSD Ormlite数据库,并使用GSon库解析服务数据。我第一次与服务器同步时遇到问题,我有一个类似地面的模型,模型存储在DB中,服务器端的id字段在模型中重复,类似于相同的id,但模型中有两个对象,当我将这些模型传递给DB(Ormlite)时然后插入一行,当第二次再次与服务器同步时,然后再次执行相同的过程,但当加载项Db时,则异常彻底主键必须是唯一的,我的问题是,如何才能找到模型中的此对象已存在于Db中,现在查询更新或插入 玩家模型 package com
package com.tt.models;
import java.util.Collection;
import com.google.gson.annotations.SerializedName;
import com.j256.ormlite.field.DatabaseField;
import com.j256.ormlite.field.ForeignCollectionField;
import com.j256.ormlite.table.DatabaseTable;
@DatabaseTable(tableName = "Player")
public class Player {
public static final String BATTING_ID_FIELD_NAME = "batting_id";
public static final String BOWLING_ID_FIELD_NAME = "bowling_id";
public static final String TEAM_ID_FIELD_NAME = "team_id";
@SerializedName("__v")
@DatabaseField(id = true)
private int id;
@SerializedName("_id")
@DatabaseField(columnName = "_id")
private String _id;
/*@SerializedName("__v")
@DatabaseField(columnName = "__v",id=true)
private int __v;*/
@DatabaseField
private String battingStyle;
@DatabaseField
private String bowlingStyle;
@DatabaseField
private String dob;
@DatabaseField
private String playingRole;
@DatabaseField
private String sname;
@DatabaseField
private String fname;
@SerializedName("gallery")
@ForeignCollectionField(eager = true, maxEagerLevel = 2)
private Collection<Gallery> gallery;
@SerializedName("games")
@ForeignCollectionField(eager = true)
private Collection<Game> games;
/*
* @DatabaseField(dataType = DataType.SERIALIZABLE) private String[] users;
*/
/*
* @DatabaseField(dataType = DataType.SERIALIZABLE) private String[] squad;
*/
Player() {
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getBattingStyle() {
return battingStyle;
}
public void setBattingStyle(String battingStyle) {
this.battingStyle = battingStyle;
}
public String getBowlingStyle() {
return bowlingStyle;
}
public void setBowlingStyle(String bowlingStyle) {
this.bowlingStyle = bowlingStyle;
}
public String getDob() {
return dob;
}
public void setDob(String dob) {
this.dob = dob;
}
public String getPlayingRole() {
return playingRole;
}
public void setPlayingRole(String playingRole) {
this.playingRole = playingRole;
}
public String getSname() {
return sname;
}
public void setSname(String sname) {
this.sname = sname;
}
public String getFname() {
return fname;
}
public void setFname(String fname) {
this.fname = fname;
}
/*
* public String[] getUsers() { return users; }
*
* public void setUsers(String[] users) { this.users = users; }
*/
/*
* public String[] getSquad() { return squad; }
*
* public void setSquad(String[] squad) { this.squad = squad; }
*/
public Collection<Gallery> getGallerys() {
return gallery;
}
public void setGallerys(Collection<Gallery> gallery) {
this.gallery = gallery;
}
public Collection<Gallery> getGallery() {
return gallery;
}
public void setGallery(Collection<Gallery> gallery) {
this.gallery = gallery;
}
public Collection<Game> getGames() {
return games;
}
public void setGames(Collection<Game> games) {
this.games = games;
}
public String get_id() {
return _id;
}
public void set_id(String _id) {
this._id = _id;
}
@Override
public String toString() {
return "Player [id=" + id + ", _id=" + _id + ", battingStyle="
+ battingStyle + ", bowlingStyle=" + bowlingStyle + ", dob="
+ dob + ", playingRole=" + playingRole + ", sname=" + sname
+ ", fname=" + fname + ", gallery=" + gallery + ", games="
+ games + "]";
}
}
播放器控制器
package com.tt.controller;
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStreamWriter;
import java.sql.SQLException;
import java.util.Iterator;
import java.util.List;
import org.json.JSONArray;
import org.json.JSONObject;
import android.os.Environment;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.j256.ormlite.dao.Dao;
import com.j256.ormlite.dao.ForeignCollection;
import com.tt.Utilities.Utils;
import com.tt.database.Database;
import com.tt.models.Batting;
import com.tt.models.Bowling;
import com.tt.models.Fielding;
import com.tt.models.Gallery;
import com.tt.models.Game;
import com.tt.models.Ground;
import com.tt.models.Inning;
import com.tt.models.Player;
import com.tt.models.Team;
public class PlayerController {
private static PlayerController instance;
private PlayerController() {
}
public List<Player> getPlayers() throws SQLException {
// query for all of the data objects in the database
return Database.getSingletonInstance(Utils.context).getPlayerDao()
.queryForAll();
}
public static PlayerController getSingletonInstance() {
if (instance == null) {
instance = new PlayerController();
}
return instance;
}
public Player JsonParse(JSONObject jsonObject) {
Player player = null;
try {
GsonBuilder builder = new GsonBuilder();
Gson gson = builder.create();
player = gson.fromJson(jsonObject.getString("players")
, Player.class);
} catch (Exception e) {
e.printStackTrace();
}
return player;
}
@SuppressWarnings("unused")
private void writeToSdcard(Player response) {
try {
File newFolder = new File(
Environment.getExternalStorageDirectory(), "TestFolder");
if (!newFolder.exists()) {
newFolder.mkdir();
}
try {
File file = new File(newFolder, "PlayerModel" + ".txt");
file.createNewFile();
FileOutputStream fOut = new FileOutputStream(file);
OutputStreamWriter myOutWriter = new OutputStreamWriter(fOut);
myOutWriter.append(response.toString());
myOutWriter.close();
fOut.close();
} catch (Exception ex) {
System.out.println("ex: " + ex);
}
} catch (Exception e) {
System.out.println("e: " + e);
}
}
public int savePlayerDB(Player player) {
int Count = 0;
writeToSdcard(player);
try {
ForeignCollection<Batting> battings = Database
.getSingletonInstance(Utils.context).getInningDao()
.getEmptyForeignCollection("battings");
ForeignCollection<Bowling> bowlings = Database
.getSingletonInstance(Utils.context).getInningDao()
.getEmptyForeignCollection("bowlings");
ForeignCollection<Fielding> fieldings = Database
.getSingletonInstance(Utils.context).getInningDao()
.getEmptyForeignCollection("Fieldings");
ForeignCollection<Team> teams = Database
.getSingletonInstance(Utils.context).getGameDao()
.getEmptyForeignCollection("teams");
ForeignCollection<Gallery> gallery = Database
.getSingletonInstance(Utils.context).getPlayerDao()
.getEmptyForeignCollection("gallery");
/*
* ForeignCollection<Inning> innings = Database
* .getSingletonInstance(Utils.context).getBattingDao()
* .getEmptyForeignCollection("innings");
*/
/*
* ForeignCollection<Game> games = Database
* .getSingletonInstance(Utils.context).getInningDao()
* .getEmptyForeignCollection("games");
*/
ForeignCollection<Ground> grounds = Database
.getSingletonInstance(Utils.context).getGameDao()
.getEmptyForeignCollection("grounds");
Iterator<Game> iteratorGame = player.getGames().iterator();
while (iteratorGame.hasNext()) {
Game game = (Game) iteratorGame.next();
if (game != null) {
game.setPlayer(player);
Iterator<Inning> iteratorInning = game.getInnings()
.iterator();
while (iteratorInning.hasNext()) {
Inning inning = (Inning) iteratorInning.next();
if (inning != null) {
inning.setGame(game);
if (inning.getBattings() != null) {
Iterator<Batting> iteratorBattings = inning
.getBattings().iterator();
while (iteratorBattings.hasNext()) {
Batting batting = (Batting) iteratorBattings
.next();
if (batting != null) {
if (batting.getPlayer()[0]
.equalsIgnoreCase(player
.get_id()))
batting.setInning(inning);
}
}
battings.addAll(inning.getBattings());
}
if (inning.getBowlings() != null) {
Iterator<Bowling> iteratorBowlings = inning
.getBowlings().iterator();
while (iteratorBowlings.hasNext()) {
Bowling bowling = (Bowling) iteratorBowlings
.next();
if (bowling != null) {
if (bowling.getPlayer()[0]
.equalsIgnoreCase(player
.get_id()))
bowling.setInning(inning);
}
}
bowlings.addAll(inning.getBowlings());
}
if (inning.getFieldings() != null) {
Iterator<Fielding> iteratorFieldings = inning
.getFieldings().iterator();
while (iteratorFieldings.hasNext()) {
Fielding fielding = (Fielding) iteratorFieldings
.next();
if (fielding != null) {
if (fielding.getPlayer()[0]
.equalsIgnoreCase(player
.get_id()))
fielding.setInning(inning);
}
}
fieldings.addAll(inning.getFieldings());
}
}
}
// innings.addAll(batting.getInnings());
Iterator<Ground> iteratorGround = game.getGrounds()
.iterator();
while (iteratorGround.hasNext()) {
Ground ground = (Ground) iteratorGround.next();
if (ground != null) {
ground.setGame(game);
}
}
grounds.addAll(game.getGrounds());
Iterator<Team> iteratorTeam = game.getTeams().iterator();
while (iteratorTeam.hasNext()) {
Team team = (Team) iteratorTeam.next();
if (team != null) {
team.setGame(game);
}
}
teams.addAll(game.getTeams());
}
}
/*
* Iterator<Bowling> iteratorBowling =
* player.getBowlings().iterator(); while
* (iteratorBowling.hasNext()) { Bowling bowling = (Bowling)
* iteratorBowling.next(); bowling.setPlayer(player);
* Iterator<Inning> iteratorInning =
* bowling.getInnings().iterator(); while (iteratorInning.hasNext())
* { Inning inning = (Inning) iteratorInning.next();
* if(inning!=null){ inning.setBowling(bowling); Iterator<Game>
* iteratorGame = inning.getGames().iterator(); while
* (iteratorGame.hasNext()) { Game game = (Game)
* iteratorGame.next(); if(game!=null) { game.setInning(inning);
* Iterator<Ground> iteratorGround = game.getGrounds().iterator();
* while (iteratorGround.hasNext()) { Ground ground = (Ground)
* iteratorGround.next(); if(ground!=null) { ground.setGame(game);
* grounds.addAll(game.getGrounds()); } } } }
* //innings.addAll(batting.getInnings()); } } }
*/
/*
* Iterator<Team> iteratorTeam = player.getTeams().iterator(); while
* (iteratorTeam.hasNext()) { Team team = (Team)
* iteratorTeam.next(); team.setPlayer(player); }
*/
Iterator<Gallery> iteratorGallery = player.getGallerys().iterator();
while (iteratorGallery.hasNext()) {
Gallery galleryobj = (Gallery) iteratorGallery.next();
galleryobj.setPlayer(player);
}
// battings.addAll(player.getBattings());
// bowlings.addAll(player.getBowlings());
// teams.addAll(player.getTeams());
gallery.addAll(player.getGallerys());
} catch (Exception e) {
e.printStackTrace();
}
return Count;
}
}
来自服务器的GSon
{
"status": 1,
"players": {
"__v": 1,
"_id": "531029b207987409620000d6",
"battingStyle": "RHB",
"bowlingStyle": "RAOS",
"dob": "2000-02-28T06:15:15.264Z",
"fname": "Tahir",
"playingRole": "BWL",
"sname": "Qadeer Butt",
"teams": [
{
"__v": 30,
"_id": "52f86b1d31f3b9b205000a58",
"category": "Veterans",
"name": "Totally Cricket",
"rating": 5,
"teamGender": "Men"
},
{
"__v": 19,
"_id": "52f9e64231f3b9b205000f36",
"category": "Under19",
"name": "Lahore Tiger",
"rating": 3,
"teamGender": "Men"
}
],
"grounds": [
{
"__v": 26,
"_id": "53381c1bf0bce0bd20000002",
"address": "14835 SE 18th Pl, Bellevue, WA 98007, United States",
"city": "Bellevue",
"country": "United States",
"latitude": "",
"longitude": "",
"name": "Robinswood Park"
},
{
"__v": 26,
"_id": "53381c1bf0bce0bd20000002",
"address": "14835 SE 18th Pl, Bellevue, WA 98007, United States",
"city": "Bellevue",
"country": "United States",
"latitude": "",
"longitude": "",
"name": "Robinswood Park"
}
]
}
}***
你的问题没有明确你的要求。您需要详细说明。plz我知道现在我更新了代码事实上,您希望存储从服务器获取的所有响应,但其中一些响应具有相同/重复的id。要处理此问题,您需要在数据库中添加一个字段/列,它将是具有自动增量属性的主键。这会解决你的问题。如果你还有任何疑问,我会澄清的。因为问题是你只需要避免/停止得到重复主键的异常。因此,以上一种方法是最好的处理方法。我在我的应用程序中尝试了同样的方法。我已经使用了自动递增主键,当我使用两个地面加载项dB时,在json解析后,在播放器模型中一次也不像两个地面具有相同的\u id时,我只添加了一个,因为id相同,第二次我再次同步服务时,如果id相同,但对象中的某些信息更改如下city now China现在只更新数据库中的记录,不在仅更新数据库更改字段中创建另一项
package com.tt.controller;
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStreamWriter;
import java.sql.SQLException;
import java.util.Iterator;
import java.util.List;
import org.json.JSONArray;
import org.json.JSONObject;
import android.os.Environment;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.j256.ormlite.dao.Dao;
import com.j256.ormlite.dao.ForeignCollection;
import com.tt.Utilities.Utils;
import com.tt.database.Database;
import com.tt.models.Batting;
import com.tt.models.Bowling;
import com.tt.models.Fielding;
import com.tt.models.Gallery;
import com.tt.models.Game;
import com.tt.models.Ground;
import com.tt.models.Inning;
import com.tt.models.Player;
import com.tt.models.Team;
public class PlayerController {
private static PlayerController instance;
private PlayerController() {
}
public List<Player> getPlayers() throws SQLException {
// query for all of the data objects in the database
return Database.getSingletonInstance(Utils.context).getPlayerDao()
.queryForAll();
}
public static PlayerController getSingletonInstance() {
if (instance == null) {
instance = new PlayerController();
}
return instance;
}
public Player JsonParse(JSONObject jsonObject) {
Player player = null;
try {
GsonBuilder builder = new GsonBuilder();
Gson gson = builder.create();
player = gson.fromJson(jsonObject.getString("players")
, Player.class);
} catch (Exception e) {
e.printStackTrace();
}
return player;
}
@SuppressWarnings("unused")
private void writeToSdcard(Player response) {
try {
File newFolder = new File(
Environment.getExternalStorageDirectory(), "TestFolder");
if (!newFolder.exists()) {
newFolder.mkdir();
}
try {
File file = new File(newFolder, "PlayerModel" + ".txt");
file.createNewFile();
FileOutputStream fOut = new FileOutputStream(file);
OutputStreamWriter myOutWriter = new OutputStreamWriter(fOut);
myOutWriter.append(response.toString());
myOutWriter.close();
fOut.close();
} catch (Exception ex) {
System.out.println("ex: " + ex);
}
} catch (Exception e) {
System.out.println("e: " + e);
}
}
public int savePlayerDB(Player player) {
int Count = 0;
writeToSdcard(player);
try {
ForeignCollection<Batting> battings = Database
.getSingletonInstance(Utils.context).getInningDao()
.getEmptyForeignCollection("battings");
ForeignCollection<Bowling> bowlings = Database
.getSingletonInstance(Utils.context).getInningDao()
.getEmptyForeignCollection("bowlings");
ForeignCollection<Fielding> fieldings = Database
.getSingletonInstance(Utils.context).getInningDao()
.getEmptyForeignCollection("Fieldings");
ForeignCollection<Team> teams = Database
.getSingletonInstance(Utils.context).getGameDao()
.getEmptyForeignCollection("teams");
ForeignCollection<Gallery> gallery = Database
.getSingletonInstance(Utils.context).getPlayerDao()
.getEmptyForeignCollection("gallery");
/*
* ForeignCollection<Inning> innings = Database
* .getSingletonInstance(Utils.context).getBattingDao()
* .getEmptyForeignCollection("innings");
*/
/*
* ForeignCollection<Game> games = Database
* .getSingletonInstance(Utils.context).getInningDao()
* .getEmptyForeignCollection("games");
*/
ForeignCollection<Ground> grounds = Database
.getSingletonInstance(Utils.context).getGameDao()
.getEmptyForeignCollection("grounds");
Iterator<Game> iteratorGame = player.getGames().iterator();
while (iteratorGame.hasNext()) {
Game game = (Game) iteratorGame.next();
if (game != null) {
game.setPlayer(player);
Iterator<Inning> iteratorInning = game.getInnings()
.iterator();
while (iteratorInning.hasNext()) {
Inning inning = (Inning) iteratorInning.next();
if (inning != null) {
inning.setGame(game);
if (inning.getBattings() != null) {
Iterator<Batting> iteratorBattings = inning
.getBattings().iterator();
while (iteratorBattings.hasNext()) {
Batting batting = (Batting) iteratorBattings
.next();
if (batting != null) {
if (batting.getPlayer()[0]
.equalsIgnoreCase(player
.get_id()))
batting.setInning(inning);
}
}
battings.addAll(inning.getBattings());
}
if (inning.getBowlings() != null) {
Iterator<Bowling> iteratorBowlings = inning
.getBowlings().iterator();
while (iteratorBowlings.hasNext()) {
Bowling bowling = (Bowling) iteratorBowlings
.next();
if (bowling != null) {
if (bowling.getPlayer()[0]
.equalsIgnoreCase(player
.get_id()))
bowling.setInning(inning);
}
}
bowlings.addAll(inning.getBowlings());
}
if (inning.getFieldings() != null) {
Iterator<Fielding> iteratorFieldings = inning
.getFieldings().iterator();
while (iteratorFieldings.hasNext()) {
Fielding fielding = (Fielding) iteratorFieldings
.next();
if (fielding != null) {
if (fielding.getPlayer()[0]
.equalsIgnoreCase(player
.get_id()))
fielding.setInning(inning);
}
}
fieldings.addAll(inning.getFieldings());
}
}
}
// innings.addAll(batting.getInnings());
Iterator<Ground> iteratorGround = game.getGrounds()
.iterator();
while (iteratorGround.hasNext()) {
Ground ground = (Ground) iteratorGround.next();
if (ground != null) {
ground.setGame(game);
}
}
grounds.addAll(game.getGrounds());
Iterator<Team> iteratorTeam = game.getTeams().iterator();
while (iteratorTeam.hasNext()) {
Team team = (Team) iteratorTeam.next();
if (team != null) {
team.setGame(game);
}
}
teams.addAll(game.getTeams());
}
}
/*
* Iterator<Bowling> iteratorBowling =
* player.getBowlings().iterator(); while
* (iteratorBowling.hasNext()) { Bowling bowling = (Bowling)
* iteratorBowling.next(); bowling.setPlayer(player);
* Iterator<Inning> iteratorInning =
* bowling.getInnings().iterator(); while (iteratorInning.hasNext())
* { Inning inning = (Inning) iteratorInning.next();
* if(inning!=null){ inning.setBowling(bowling); Iterator<Game>
* iteratorGame = inning.getGames().iterator(); while
* (iteratorGame.hasNext()) { Game game = (Game)
* iteratorGame.next(); if(game!=null) { game.setInning(inning);
* Iterator<Ground> iteratorGround = game.getGrounds().iterator();
* while (iteratorGround.hasNext()) { Ground ground = (Ground)
* iteratorGround.next(); if(ground!=null) { ground.setGame(game);
* grounds.addAll(game.getGrounds()); } } } }
* //innings.addAll(batting.getInnings()); } } }
*/
/*
* Iterator<Team> iteratorTeam = player.getTeams().iterator(); while
* (iteratorTeam.hasNext()) { Team team = (Team)
* iteratorTeam.next(); team.setPlayer(player); }
*/
Iterator<Gallery> iteratorGallery = player.getGallerys().iterator();
while (iteratorGallery.hasNext()) {
Gallery galleryobj = (Gallery) iteratorGallery.next();
galleryobj.setPlayer(player);
}
// battings.addAll(player.getBattings());
// bowlings.addAll(player.getBowlings());
// teams.addAll(player.getTeams());
gallery.addAll(player.getGallerys());
} catch (Exception e) {
e.printStackTrace();
}
return Count;
}
}
Player[
id=1,
_id=531029b207987409620000d6,
battingStyle=RHB,
bowlingStyle=RAOS,
dob=2000-02-28T06: 15: 15.264Z,
playingRole=BWL,
sname=QadeerButt,
fname=Tahir,
gallery=[
],
games=[
Game[
id=4,
gameType=T20,
name=TotallyCricketvsLahoreTiger,
totalOvers=20,
dateStarted=2014-06-18T19: 00: 00.000Z,
dateEnded=2014-06-18T19: 00: 00.000Z,
innings=[
],
grounds=[
Ground[
id=26,
address=14835SE18thPl,
Bellevue,
WA98007,
UnitedStates,
city=Bellevue,
country=UnitedStates,
name=RobinswoodPark
],
Ground[
id=26,
address=14835SE18thPl,
Bellevue,
WA98007,
UnitedStates,
city=Bellevue,
country=UnitedStates,
name=RobinswoodPark
]
],
teams=[
Team[
id=30,
name=TotallyCricket,
category=Veterans,
teamGender=Men,
rating=5
],
Team[
id=19,
name=LahoreTiger,
category=Under19,
teamGender=Men,
rating=3
]
]
]
]
]
{
"status": 1,
"players": {
"__v": 1,
"_id": "531029b207987409620000d6",
"battingStyle": "RHB",
"bowlingStyle": "RAOS",
"dob": "2000-02-28T06:15:15.264Z",
"fname": "Tahir",
"playingRole": "BWL",
"sname": "Qadeer Butt",
"teams": [
{
"__v": 30,
"_id": "52f86b1d31f3b9b205000a58",
"category": "Veterans",
"name": "Totally Cricket",
"rating": 5,
"teamGender": "Men"
},
{
"__v": 19,
"_id": "52f9e64231f3b9b205000f36",
"category": "Under19",
"name": "Lahore Tiger",
"rating": 3,
"teamGender": "Men"
}
],
"grounds": [
{
"__v": 26,
"_id": "53381c1bf0bce0bd20000002",
"address": "14835 SE 18th Pl, Bellevue, WA 98007, United States",
"city": "Bellevue",
"country": "United States",
"latitude": "",
"longitude": "",
"name": "Robinswood Park"
},
{
"__v": 26,
"_id": "53381c1bf0bce0bd20000002",
"address": "14835 SE 18th Pl, Bellevue, WA 98007, United States",
"city": "Bellevue",
"country": "United States",
"latitude": "",
"longitude": "",
"name": "Robinswood Park"
}
]
}
}***