Java 多次访问SQLite数据库后,我的应用程序崩溃。唯一约束误差

Java 多次访问SQLite数据库后,我的应用程序崩溃。唯一约束误差,java,android,sqlite,android-sqlite,unique-constraint,Java,Android,Sqlite,Android Sqlite,Unique Constraint,我是Android开发的新手,我一直在学习一个教程,该教程创建了一个Twitter应用程序,显示用户的时间线,并让他们能够为他们关注的人回复和转发推文 我已经完成了那个教程,现在我正在尝试在应用程序中实现直接消息传递。到目前为止,我已经让我的应用程序显示用户的时间线和他们收到的直接消息列表,但是当用户在显示他们时间线的主要活动和他们的收件箱之间单击时,应用程序最终崩溃 错误消息如下所示: android.database.sqlite.SQLiteConstraintException:唯一约束

我是Android开发的新手,我一直在学习一个教程,该教程创建了一个Twitter应用程序,显示用户的时间线,并让他们能够为他们关注的人回复和转发推文

我已经完成了那个教程,现在我正在尝试在应用程序中实现直接消息传递。到目前为止,我已经让我的应用程序显示用户的时间线和他们收到的直接消息列表,但是当用户在显示他们时间线的主要活动和他们的收件箱之间单击时,应用程序最终崩溃

错误消息如下所示:

android.database.sqlite.SQLiteConstraintException:唯一约束失败:messageInbox.\u id(代码1555 sqlite\u constraint\u PRIMARYKEY[1555])

我已经在网上搜索了错误代码和解决方案,到目前为止还没有找到。我非常感谢在解决这个问题上的任何帮助,以及与我这里的代码相关的任何其他指针,因为我是Java新手

它运行在Android 9上,除了一些不推荐的方法外,我还使用了AndroidX

在my MessageService类中调用下面的insertOrThrow方法时发生错误

试试看{
整数计数=50;
DirectMessageList directMessages=messageTwitter.getDirectMessages(计数);
用于(DirectMessage消息:directMessages){
ContentValues messageValues=MessageDataHelper.getValues(message);
messageDB.insertOrThrow(“messageInbox”,null,messageValues);
messagesChanges=true;
}
}捕获(twitter异常){
字符串LOG_TAG=“MessageService”;
Log.e(日志标签,“异常:+te”);
消息服务类


公共类MessageService扩展了服务{
//twitter身份验证密钥
公共最终静态字符串TWIT_KEY=“xxxxxxxxx”;
//推特秘密
公共最终静态字符串TWIT_SECRET=“xxxxxxxxx”;
//应用程序首选项
分享生物参考文献;
//twitter对象
私人推特消息推特;
//数据库辅助对象
私有MessageDataHelper messageHelper;
//时间线数据库
私有sqlitedatabasemessagedb;
//更新程序的处理程序
公共处理器messageHandler;
//获取新tweet之间的延迟
//私有静态int mins=1;//根据需要更改
//专用静态最终长取_延迟=分钟*(60*1000);
私有静态最终长取_DELAY=30000;//每30秒更新一次时间线
//更新程序线程对象
私有消息更新程序;
@凌驾
public void onCreate(){
super.onCreate();
//开设班级
//获取首选项
//用户详细信息的共享首选项
bioPrefs=GetSharedReferences(“bioPrefs”,0);
//获取用户首选项
String userToken=bioPrefs.getString(“用户令牌”,null);
String userSecret=bioPrefs.getString(“user\u secret”,null);
//获取数据库帮助程序
//数据库辅助对象
messageHelper=新MessageDataHelper(此);
//获取数据库
messageDB=messageHelper.getWritableDatabase();
//创建新配置
Configuration messageConf=new ConfigurationBuilder()
.setOAuthConsumerKey(TWIT_键)
.setOAuthConsumerCret(TWIT_SECRET)
.setOAuthAccessToken(userToken)
.setOAuthAccessTokenSecret(userSecret)
.build();
//实例化新twitter
messageTwitter=newtwitterfactory(messageConf).getInstance();
}
@凌驾
公共IBinder onBind(意向){
返回null;
}
私有类MessageUpdater实现Runnable{
公开募捐{
布尔messagesChanges=false;
StrictMode.ThreadPolicy policy=新建StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(策略);
试一试{
整数计数=50;
DirectMessageList directMessages=messageTwitter.getDirectMessages(计数);
用于(DirectMessage消息:directMessages){
ContentValues messageValues=MessageDataHelper.getValues(message);
messageDB.insertOrThrow(“messageInbox”,null,messageValues);
messagesChanges=true;
}
}捕获(twitter异常){
字符串LOG_TAG=“MessageService”;
Log.e(Log_标记,“Exception:+te);}
if(messagesChanges){
发送广播(新意图(“消息更新”);
}
messageHandler.postDelayed(这是FETCH\u DELAY);
}
}
@凌驾
公共int onStartCommand(Intent Intent、int标志、int startId){
super.onStart(intent,startId);
//获取处理程序
messageHandler=newhandler();
//创建updater类的实例
messageUpdater=新messageUpdater();
//添加到运行队列
messageHandler.post(messageUpdater);
//返回粘性
返回开始时间;
}
@凌驾
公共空间{
super.ondestory();
//停止更新
removeCallbacks(messageUpdater);
messageDB.close();
}
}
MessageDataHelper


公共类MessageDataHelper扩展了SQLiteOpenHelper{
//变量声明
//数据库版本
私有静态最终int DB_版本=1;
//数据库名称
私有静态最终字符串数据库\u NAME=“messageInbox.db”;
//ID列
私有静态最终字符串Home\u COL=BaseColumns.\u ID;
//推文
私有静态最终字符串更新\u COL=“message\u text”;
//twitter屏幕名称
私有静态最终字符串User\u COL=“User\u screen”;
//时间推特
私家侦探