我在尝试成功跟踪发送到服务器的令牌时遇到问题。令牌用于Android应用程序中的GCM通知。
场景是这样的:当用户安装应用程序时,我创建一个GCM令牌,将其存储在共享首选项中并将其发送到我的服务器进行存储,以便稍后发送通知。这部分很容易。将令牌存储在我的服务器和应用程序用户手机上没问题。我可以向未在应用中注册帐户的最终用户发送常规通知。
如果用户注册了帐户并登录了他们的帐户,我会更新并将用户ID与令牌相关联。当我想向单个应用用户发送特定通知时,这有助于我。到目前为止仍然很容易。
这是我的表和存储过程,用于更新
demoCroque
这是我遇到问题的/home/Escritorio/demoCroque
存储过程。我是第一次安装应用程序,现在我有一个令牌。好东西..然后我注册并登录,现在我有一个用户ID令牌。很棒...然后我买了一部新手机并下载了应用程序。生成并存储了新令牌,问题是当我登录并尝试更新新创建的令牌时,我已经在表中存储了用户ID。我不确定UID是否是最好的方法。
我不确定是否应该以不同方式设置我的表格。我知道我想确保我可以跟踪没有错误的令牌。我想我可能需要一些删除语句,在存储过程中的某些地方,不确定。
非常感谢任何帮助或建议。
答案 0 :(得分:2)
这可能更简洁。它使用RETURN
而不是SELECT
立即退出,为意外状态抛出错误。它还假定USTAMP
和ISTAMP
已定义默认值。不确定为什么要添加3小时,但您可能需要查看时区感知数据类型。
CREATE PROCEDURE [dbo].[spGCMupdate]
@T VARCHAR(255),
@U VARCHAR (128)
AS
BEGIN
-- If this is a new user against existing token, update it
UPDATE NOTIFICATION
SET
USTAMP = DATEADD(HH, 3, GETDATE()),
USER = @U
WHERE TOKEN = @T
AND (USER IS NULL OR USER <> @U)
IF @@ROWCOUNT > 0
RETURN 1
-- If this is an existing user against a different token
-- change the token
UPDATE NOTIFICATION
SET
USTAMP = DATEADD(HH, 3, GETDATE()),
TOKEN = @T
WHERE USER = @U
AND TOKEN <> @T
IF @@ROWCOUNT > 0
RETURN 2
-- Completely new
INSERT INTO NOTIFICATION(TOKEN, UID)
SELECT @T, @U
WHERE NOT EXISTS (
SELECT * FROM NOTIFICATION
WHERE TOKEN = @T
AND USER = @U
IF @@ROWCOUNT > 0
RETURN 3
IF EXISTS (
SELECT * FROM NOTIFICATION
WHERE TOKEN = @T
AND USER = @U
)
RETURN 4 -- Already exists. No change
THROW 60000 ,'Unexpected State encountered'
END
答案 1 :(得分:0)
感谢Nick的建议。它帮助我提出了一个解决方案。我不知道这是不是最好的解决方案,但它似乎满足了所有的要求,这是我今晚能想到的最好的,也许有一些睡眠,我会想出更好的东西。我相信还有改进的余地。
CREATE PROCEDURE [dbo].[spGCMupdate]
@T VARCHAR(255),
@U VARCHAR (128),
@RESULT TINYINT OUTPUT
AS
BEGIN
DECLARE @PAIR int
SET @PAIR = (SELECT COUNT(TOKEN) FROM NOTIFICATION WHERE TOKEN = @T AND UID = @U)
IF (@PAIR = 1) -- the Token and Userid are already paired no update required
BEGIN
SET @RESULT = '1' -- all good
END
ELSE IF (@PAIR = 0) -- attempt to pair
BEGIN
UPDATE NOTIFICATION SET UID = @U, USTAMP = DATEADD(HH, 3, GETDATE()) WHERE UID IS NULL AND TOKEN = @T --add uid to token
END
ELSE IF (@@ROWCOUNT = 0)
BEGIN
UPDATE NOTIFICATION SET TOKEN = @T, USTAMP = DATEADD(HH, 3, GETDATE()) WHERE UID = @U -- handle a token update
END
IF (@@ROWCOUNT=0 AND @PAIR =0) -- Last Resort
BEGIN
DELETE FROM NOTIFICATION WHERE TOKEN = @T OR UID = @U -- delete Token and User Id
INSERT INTO NOTIFICATION(TOKEN, UID, USTAMP, ISTAMP) VALUES (@T, @U, DATEADD(HH, 3, GETDATE()), DATEADD(HH, 3, GETDATE())) --Insert new pair
END
IF (@@ROWCOUNT > 0)
BEGIN
SET @RESULT = '1'
END
ELSE IF (@@ROWCOUNT=0 AND @PAIR =0)
BEGIN
SET @RESULT = '0'
END
SELECT @RESULT
END